Sök…


Restfull Projects API med Gin

Gin är ett webbramverk skrivet i Golang. Den har ett martini-liknande API med mycket bättre prestanda, upp till 40 gånger snabbare. Om du behöver prestanda och god produktivitet kommer du att älska Gin.


Det kommer att finnas 8 paket + main.go

  1. controllers
  2. kärna
  3. libs
  4. middlewares
  5. offentlig
  6. routrar
  7. tjänster
  8. tester
  9. main.go

projektstruktur


controllers

Controllers-paket lagrar all API-logik. Oavsett din API kommer din logik att hända här

controllers


kärna

Core-paketet lagrar alla dina skapade modeller, ORM, etc.

kärna


libs

Detta paket lagrar alla bibliotek som används i projekt. Men bara för manuellt skapade / importerade bibliotek go get package_name som inte är tillgängliga när du använder. Kan vara din egen hashningsalgoritm, graf, träd etc.

libs


middlewares

Detta paket lagrar alla mellanprogram som använts i projekt, kan vara skapande / validering av kors, enhets-ID, autorisation osv

middlewares


offentlig

Denna pacakge lagrar alla offentliga och statiska filer, kan vara html, css, javascript, bilder etc.

offentlig

routrar

Detta paket lagrar alla rutter i ditt REST-API.

routrar

Se exempelkod för hur du tilldelar rutter.

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)
}

Om du ser, är anledningen till att jag separerar hanteraren att vi enkelt kan hantera alla routrar. Så jag kan skapa kommentarer om API, att med apidoc kommer att generera detta till strukturerad dokumentation. Då kommer jag att kalla funktionen i index.go i det aktuella paketet

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)
}

tjänster

Detta paket lagrar alla konfigurationer och inställningar som används i projekt från vilken tjänst som helst, kan vara mongodb, redis, mysql, elasticsearch, etc.

tjänster


main.go

API: s huvudingång. Eventuell konfiguration om dev-miljöinställningar, system, port osv kommer att konfigureras här.

Exempel:
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: Varje kod i detta exempel kommer från olika projekt


se exempelprojekt på github



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow