gin 註解路由,自動引數繫結工具

xie1xiao1jun發表於2019-12-08

ginprc

golang gin 引數自動繫結工具

  • 支援 rpc 自動對映
  • 支援物件註冊
  • 支援註解路由
  • 基於 go-gin 的 json restful 風格的 golang 基礎庫
  • 自帶請求引數過濾及繫結實現 binding:"required" validator
  • 程式碼註冊簡單且支援多種註冊方式

api 介面說明

支援 3 種介面模式

  • func(gin.Context) //go-gin 原始介面
    func(
     api.Context) // 自定義的 context 型別
  • func(api.Context,req) // 自定義的 context 型別,帶 request 請求引數
    func(
     api.Context,*req)
  • func(gin.Context,req) //go-gin context 型別,帶 request 請求引數
    func(*gin.Context,req)

示例程式碼

初始化專案 (本專案以 ginweb 為名字)

go mod init ginweb

程式碼 (詳細地址:https://github.com/xxjwxc/ginrpc/tree/master/sample/ginweb)

  package main

import ( "fmt" "net/http"

_ "ginweb/routers" // debug模式需要新增[mod]/routers 註冊註解路由

"github.com/gin-gonic/gin" "github.com/xxjwxc/ginrpc" "github.com/xxjwxc/ginrpc/api" )

type ReqTest struct { Access_token string json:"access_token" UserName string json:"user_name" binding:"required" // 帶校驗方式 Password string json:"password" }

// Hello ... type Hello struct { Index int }

// Hello 帶註解路由(參考beego形式) // @router /block [post,get] func (s *Hello) Hello(c *api.Context, req *ReqTest) { fmt.Println(req) fmt.Println(s.Index) c.JSON(http.StatusOK, "ok") }

// Hello2 不帶註解路由(引數為2預設post) func (s *Hello) Hello2(c *gin.Context, req ReqTest) { fmt.Println(req) fmt.Println(s.Index) c.JSON(http.StatusOK, "ok") }

//TestFun1 gin 預設的函式回撥地址 func TestFun1(c *gin.Context) { fmt.Println(c.Params) c.String(200, "ok") }

//TestFun2 自定義context的函式回撥地址 func TestFun2(c *api.Context) { fmt.Println(c.Params) c.JSON(http.StatusOK, "ok") }

//TestFun3 帶自定義context跟已解析的req引數回撥方式 func TestFun3(c *api.Context, req *ReqTest) { fmt.Println(c.Params) fmt.Println(req) c.JSON(http.StatusOK, "ok") }

//TestFun4 帶自定義context跟已解析的req引數回撥方式 func TestFun4(c *gin.Context, req ReqTest) { fmt.Println(c.Params) fmt.Println(req)

c.JSON(http.StatusOK, req) }

func main() { base := ginrpc.New(ginrpc.WithCtx(func(c *gin.Context) interface{} { return api.NewCtx(c) }), ginrpc.WithDebug(true), ginrpc.WithGroup("xxjwxc"))

router := gin.Default() h := new(Hello) h.Index = 123 base.Register(router, h) // 物件註冊 router.POST("/test1", base.HandlerFunc(TestFun1)) // 函式註冊 router.POST("/test2", base.HandlerFunc(TestFun2)) router.POST("/test3", base.HandlerFunc(TestFun3)) router.POST("/test4", base.HandlerFunc(TestFun4)) base.RegisterHandlerFunc(router, []string{"post", "get"}, "/test", TestFun1) // 多種請求方式註冊

router.Run(":8080") }

  • curl
    curl 'http://127.0.0.1:8080/test4' -H 'Content-Type: application/json' -d '{"access_token":"111", "user_name":"222", "password":"333"}'
    

註解路由

  • 1. 註解路由會自動建立 [mod]/routers/gen_router.go 檔案 需要在呼叫時加:

    _ "[mod]/routers" // debug模式需要新增[mod]/routers 註冊註解路由
    

    預設也會在專案根目錄生成 [gen_router.data] 檔案 (保留次檔案,可以不用新增上面程式碼嵌入)

  • 2. 註解路由呼叫方式:

    base := ginrpc.New(ginrpc.WithCtx(func(c *gin.Context) interface{} {
        return api.NewCtx(c)
    }), ginrpc.WithDebug(true), ginrpc.WithGroup("xxjwxc"))
    base.Register(router, new(Hello))                          // 物件註冊
    router.Run(":8080")
    

    詳細請看 demo ginweb

  • 3. 執行 curl,可以自動引數繫結。直接看結果

    curl 'http://127.0.0.1:8080/xxjwxc/block' -H 'Content-Type: application/json' -d '{"access_token":"111", "user_name":"222", "password":"333"}'
    
    curl 'http://127.0.0.1:8080/xxjwxc/hello.hello2' -H 'Content-Type: application/json' -d '{"access_token":"111", "user_name":"222", "password":"333"}'
    
  • 4 引數說明
    ginrpc.WithCtx : 設定自定義 context
    ginrpc.WithDebug (true) : 設定 debug 模式
    ginrpc.WithGroup ("xxjwxc") : 新增路由字首 (也可以使用 gin.Group 分組)
    ginrpc.WithBigCamel (true) : 設定大駝峰標準 (false 為 web 模式,_, 小寫)

    更多

下一步

1.匯出api文件
2.匯出postman測試配置

程式碼地址: ginprc 如果喜歡請給星支援

傳送門

如果你喜歡,請'star'

更多原創文章乾貨分享,請關注公眾號
  • gin 註解路由,自動引數繫結工具
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章