与 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 上的示例项目