Go
Buenas prácticas en la estructura del proyecto.
Buscar..
Proyectos Restfull API con Gin
Gin es un framework web escrito en golang. Cuenta con una API similar a la de martini con un rendimiento mucho mejor, hasta 40 veces más rápido. Si necesitas rendimiento y buena productividad, te encantará la ginebra.
Habrá 8 paquetes + main.go
- controladores
- núcleo
- libs
- middlewares
- público
- enrutadores
- servicios
- pruebas
- main.go
controladores
El paquete de controladores almacenará toda la lógica de la API. Cualquiera que sea tu API, tu lógica sucederá aquínúcleo
El paquete central almacenará todos sus modelos creados, ORM, etc.libs
Este paquete almacenará cualquier biblioteca que se use en proyectos. Pero solo para la biblioteca creada / importada manualmente, que no está disponible cuando se usan los comandosgo get package_name . Podría ser tu propio algoritmo hash, gráfico, árbol, etc. middlewares
Este paquete almacena cada middleware que se usa en el proyecto, podría ser la creación / validación de cors, device-id, auth, etc.público
Este paquete almacenará todos los archivos públicos y estáticos, pueden ser html, css, javascript, imágenes, etc.enrutadores
Este paquete almacenará todas las rutas en su API REST.Ver código de ejemplo cómo asignar las rutas.
auth_r.go
import (
auth "simple-api/controllers/v1/auth"
"gopkg.in/gin-gonic/gin.v1"
)
func SetAuthRoutes(router *gin.RouterGroup) {
/**
* @api {post} /v1/auth/login Login
* @apiGroup Users
* @apiHeader {application/json} Content-Type Accept application/json
* @apiParam {String} username User username
* @apiParam {String} password User Password
* @apiParamExample {json} Input
* {
* "username": "your username",
* "password" : "your password"
* }
* @apiSuccess {Object} authenticate Response
* @apiSuccess {Boolean} authenticate.success Status
* @apiSuccess {Integer} authenticate.statuscode Status Code
* @apiSuccess {String} authenticate.message Authenticate Message
* @apiSuccess {String} authenticate.token Your JSON Token
* @apiSuccessExample {json} Success
* {
* "authenticate": {
* "statuscode": 200,
* "success": true,
* "message": "Login Successfully",
* "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
* }
* }
* @apiErrorExample {json} List error
* HTTP/1.1 500 Internal Server Error
*/
router.POST("/auth/login" , auth.Login)
}
Si ve, la razón por la que separo el controlador es para que podamos administrar cada uno de los enrutadores. Entonces puedo crear comentarios sobre la API, que con apidoc generará esto en documentación estructurada. Luego llamaré a la función en index.go en el paquete actual
index.go
package v1
import (
"gopkg.in/gin-gonic/gin.v1"
token "simple-api/middlewares/token"
appid "simple-api/middlewares/appid"
)
func InitRoutes(g *gin.RouterGroup) {
g.Use(appid.AppIDMiddleWare())
SetHelloRoutes(g)
SetAuthRoutes(g) // SetAuthRoutes invoked
g.Use(token.TokenAuthMiddleWare()) //secure the API From this line to bottom with JSON Auth
g.Use(appid.ValidateAppIDMiddleWare())
SetTaskRoutes(g)
SetUserRoutes(g)
}
servicios
Este paquete almacenará cualquier configuración y configuración para usar en el proyecto de cualquier servicio usado, podría ser mongodb, redis, mysql, elasticsearch, etc.main.go
La entrada principal de la API. Aquí se configurará cualquier configuración acerca de la configuración del entorno de desarrollo, sistemas, puertos, etc. Ejemplo:
main.go
package main
import (
"fmt"
"net/http"
"gopkg.in/gin-gonic/gin.v1"
"articles/services/mysql"
"articles/routers/v1"
"articles/core/models"
)
var router *gin.Engine;
func init() {
mysql.CheckDB()
router = gin.New();
router.NoRoute(noRouteHandler())
version1:=router.Group("/v1")
v1.InitRoutes(version1)
}
func main() {
fmt.Println("Server Running on Port: ", 9090)
http.ListenAndServe(":9090",router)
}
func noRouteHandler() gin.HandlerFunc{
return func(c *gin.Context) {
var statuscode int
var message string = "Not Found"
var data interface{} = nil
var listError [] models.ErrorModel = nil
var endpoint string = c.Request.URL.String()
var method string = c.Request.Method
var tempEr models.ErrorModel
tempEr.ErrorCode = 4041
tempEr.Hints = "Not Found !! \n Routes In Valid. You enter on invalid Page/Endpoint"
tempEr.Info = "visit http://localhost:9090/v1/docs to see the available routes"
listError = append(listError,tempEr)
statuscode = 404
responseModel := &models.ResponseModel{
statuscode,
message,
data,
listError,
endpoint,
method,
}
var content gin.H = responseModel.NewResponse();
c.JSON(statuscode,content)
}
}
ps: Cada código en este ejemplo, provienen de diferentes proyectos
ver proyectos de muestra en github
Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow







