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