Szukaj…


Restfull Projects API with Gin

Gin to framework internetowy napisany w Golang. Posiada podobny do martini interfejs API o znacznie lepszej wydajności, nawet 40 razy szybszy. Jeśli potrzebujesz wydajności i dobrej wydajności, pokochasz Gin.


Będzie 8 paczek + main.go

  1. kontrolery
  2. rdzeń
  3. libs
  4. middleware
  5. publiczny
  6. routery
  7. usługi
  8. testy
  9. main.go

struktura projektów


kontrolery

Pakiet kontrolerów będzie przechowywał całą logikę API. Bez względu na interfejs API, logika się tutaj stanie

kontrolery


rdzeń

Pakiet podstawowy przechowuje wszystkie utworzone modele, ORM itp

rdzeń


libs

Ten pakiet będzie przechowywać dowolną bibliotekę używaną w projektach. Ale tylko dla ręcznie utworzonej / importowanej biblioteki, która nie jest dostępna podczas używania komend go get package_name . Może to być Twój własny algorytm haszujący, wykres, drzewo itp.

libs


middleware

Ten pakiet przechowuje każde oprogramowanie pośrednie użyte w projekcie, może to być tworzenie / sprawdzanie poprawności cors, ID urządzenia, autoryzacja itp

middleware


publiczny

Ten pacakge będzie przechowywać wszystkie pliki publiczne i statyczne, mogą to być html, css, javascript, obrazy itp

publiczny

routery

W tym pakiecie będą przechowywane wszystkie trasy w interfejsie API REST.

routery

Zobacz przykładowy kod, jak przypisać trasy.

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

Jeśli widzisz, powodem oddzielenia modułu obsługi jest ułatwienie nam zarządzania każdym routerem. Mogę więc tworzyć komentarze na temat API, które dzięki apidoc wygenerują to w ustrukturyzowanej dokumentacji. Następnie wywołam funkcję w index.go w bieżącym pakiecie

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

usługi

Ten pakiet będzie przechowywać dowolną konfigurację i ustawienia używane w projekcie z dowolnej używanej usługi, może to być mongodb, redis, mysql, elasticsearch itp.

usługi


main.go

Główne wejście API. Tutaj zostanie skonfigurowana dowolna konfiguracja ustawień środowiska programistycznego, systemów, portu itp.

Przykład:
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: Każdy kod w tym przykładzie pochodzi z różnych projektów


zobacz przykładowe projekty na github



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow