Suche…


Restfull Projects API mit Gin

Gin ist ein in Golang geschriebenes Web-Framework. Es verfügt über eine martiniähnliche API, die bis zu 40-mal schneller ist. Wenn Sie Leistung und gute Produktivität benötigen, werden Sie Gin lieben.


Es wird 8 Pakete + main.go geben

  1. Steuerungen
  2. Ader
  3. Libs
  4. Middlewares
  5. Öffentlichkeit
  6. Router
  7. Dienstleistungen
  8. Tests
  9. main.go

Projektstruktur


Steuerungen

Das Controller-Paket speichert die gesamte API-Logik. Was auch immer Ihre API ist, Ihre Logik wird hier geschehen

Steuerungen


Ader

Im Kernpaket werden alle erstellten Modelle, ORM usw. gespeichert

Ader


Libs

In diesem Paket wird jede Bibliothek gespeichert, die in Projekten verwendet wird. Aber nur für manuell erstellte / importierte Bibliotheken, die nicht verfügbar sind, wenn die Befehle go get package_name werden. Könnte Ihr eigener Hash-Algorithmus, Graph, Baum usw. sein

Libs


Middlewares

Dieses Paket speichert jede Middleware, die in einem Projekt verwendet wird. Dies kann die Erstellung / Validierung von Kors, die Geräte-ID, die Authentifizierung usw.

Middlewares


Öffentlichkeit

In diesem Paket werden alle öffentlichen und statischen Dateien gespeichert. Dies können HTML, CSS, Javascript, Bilder usw. sein

Öffentlichkeit

Router

Dieses Paket speichert alle Routen in Ihrer REST-API.

Router

Siehe Beispielcode zum Zuweisen der Routen.

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

Wenn Sie sehen, ist der Grund, warum ich den Handler trenne, einfach, die einzelnen Router zu verwalten. So kann ich Kommentare zur API erstellen, die mit apidoc in strukturierter Dokumentation generiert werden. Dann werde ich die Funktion in index.go im aktuellen Paket aufrufen

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

Dienstleistungen

In diesem Paket werden alle in einem Projekt verwendeten Konfigurationen und Einstellungen gespeichert, z. B. Mongodb, Redis, MySQL, Elasticsearch usw.

Dienstleistungen


main.go

Der Haupteingang der API. Alle Einstellungen zu den Einstellungen der Dev-Umgebung, zu Systemen, zum Port usw. werden hier konfiguriert.

Beispiel:
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: Jeder Code in diesem Beispiel stammt aus verschiedenen Projekten


Siehe Beispielprojekte auf Github



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow