與 Gin 的 Restfull Projects API

Gin 是一個用 Golang 編寫的 Web 框架。它具有類似馬提尼的 API,具有更好的效能,速度提高了 40 倍。如果你需要表現和良好的生產力,你會愛上杜松子酒。

將有 8 個包+ main.go

  1. 控制器
  2. 核心
  3. 中介軟體
  4. 上市
  5. 路由器
  6. 服務
  7. 測試
  8. main.go

StackOverflow 文件

控制器

Controllers 包將儲存所有 API 邏輯。無論你的 API 是什麼,你的邏輯都會在這裡發生

StackOverflow 文件

核心

核心包將儲存你建立的所有模型,ORM 等

StackOverflow 文件

該包將儲存專案中使用的任何庫。但僅限於手動建立/匯入的庫,使用 go get package_name 命令時不可用。可能是你自己的雜湊演算法,圖形,樹等。

StackOverflow 文件

中介軟體

這個包儲存了專案中使用的每個中介軟體,可以是 cors,device-id,auth 等的建立/驗證

StackOverflow 文件

上市

這個 pacakge 將儲存每個公共和靜態檔案,可以是 html,css,javascript,影象等

StackOverflow 文件

路由器

該包將儲存 REST API 中的每個路由。

StackOverflow 文件

請參閱示例程式碼如何分配路由。

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

如果你看到,我將處理程式分開的原因是,我們很容易管理每個路由器。所以我可以建立關於 API 的註釋,使用 apidoc 將其生成結構化文件。然後我將在當前包中呼叫 index.go 中的函式

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

服務

這個包將儲存任何使用過的服務在專案中使用的任何配置和設定,可以是 mongodb,redis,mysql,elasticsearch 等。

StackOverflow 文件

main.go

API 的主要入口。此處將配置有關開發環境設定,系統,埠等的任何配置。

示例:

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 !! 
 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:本例中的每個程式碼都來自不同的專案

看看 github 上的示例專案