Go
Meilleures pratiques sur la structure du projet
Recherche…
API Restfull Projects avec Gin
Gin est un framework web écrit en Golang. Il dispose d'une API de type martini avec des performances bien supérieures, jusqu'à 40 fois plus rapides. Si vous avez besoin de performance et de bonne productivité, vous allez adorer le Gin.
Il y aura 8 paquets + main.go
- contrôleurs
- coeur
- libs
- middlewares
- Publique
- routeurs
- prestations de service
- des tests
- main.go
contrôleurs
Le package de contrôleurs stockera toute la logique API. Quelle que soit votre API, votre logique se produira icicoeur
Le package principal stockera tous vos modèles créés, ORM, etc.libs
Ce paquet stockera toute bibliothèque utilisée dans les projets. Mais uniquement pour les bibliothèques créées / importées manuellement, qui ne sont pas disponibles lors de l'utilisation des commandesgo get package_name
. Pourrait être votre propre algorithme de hachage, graphe, arbre, etc. middlewares
Ce paquet stocke tous les middleware utilisés dans le projet, peut être la création / validation de cors, device-id, auth etcPublique
Ce pacakge stockera tous les fichiers publics et statiques, par exemple html, css, javascript, images, etc.routeurs
Ce paquet stockera toutes les routes dans votre API REST.Voir exemple de code pour attribuer les routes.
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 vous voyez, la raison pour laquelle je sépare le gestionnaire est de nous aider à gérer chaque routeur. Je peux donc créer des commentaires sur l’API, qui avec apidoc généreront cela dans la documentation structurée. Ensuite, je vais appeler la fonction dans index.go dans le package actuel
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) }
prestations de service
Ce paquet stockera toutes les configurations et tous les paramètres utilisés dans un projet à partir de n'importe quel service utilisé, pouvant être mongodb, redis, mysql, elasticsearch, etc.main.go
L'entrée principale de l'API. Toute configuration concernant les paramètres de l'environnement de développement, les systèmes, le port, etc. sera configurée ici. Exemple:
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: Chaque code de cet exemple provient de différents projets
voir des exemples de projets sur github