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

  1. contrôleurs
  2. coeur
  3. libs
  4. middlewares
  5. Publique
  6. routeurs
  7. prestations de service
  8. des tests
  9. main.go

structure de projets


contrôleurs

Le package de contrôleurs stockera toute la logique API. Quelle que soit votre API, votre logique se produira ici

contrôleurs


coeur

Le package principal stockera tous vos modèles créés, ORM, etc.

coeur


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 commandes go get package_name . Pourrait être votre propre algorithme de hachage, graphe, arbre, etc.

libs


middlewares

Ce paquet stocke tous les middleware utilisés dans le projet, peut être la création / validation de cors, device-id, auth etc

middlewares


Publique

Ce pacakge stockera tous les fichiers publics et statiques, par exemple html, css, javascript, images, etc.

Publique

routeurs

Ce paquet stockera toutes les routes dans votre API REST.

routeurs

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.

prestations de service


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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow