go-zero 自定義模板

2022-04-22 10:53 更新

場(chǎng)景

實(shí)現(xiàn)統(tǒng)一格式的body響應(yīng),格式如下:

{
  "code": 0,
  "msg": "OK",
  "data": {} // ①
}

① 實(shí)際響應(yīng)數(shù)據(jù)

go-zero生成的代碼沒(méi)有對(duì)其進(jìn)行處理

準(zhǔn)備工作

我們提前在module為greet的工程下的response包中寫(xiě)一個(gè)Response方法,目錄樹(shù)類(lèi)似如下:

greet
├── response
│   └── response.go
└── xxx...

代碼如下

package response

import (
    "net/http"

    "github.com/zeromicro/go-zero/rest/httpx"
)

type Body struct {
    Code int         `json:"code"`
    Msg  string      `json:"msg"`
    Data interface{} `json:"data,omitempty"`
}

func Response(w http.ResponseWriter, resp interface{}, err error) {
    var body Body
    if err != nil {
        body.Code = -1
        body.Msg = err.Error()
    } else {
        body.Msg = "OK"
        body.Data = resp
    }
    httpx.OkJson(w, body)
}

修改handler模板

$ vim ~/.goctl/api/handler.tpl

將模板替換為以下內(nèi)容

package handler

import (
    "net/http"
    "greet/response"http:// ①
    {% raw %}
    {{.ImportPackages}}
    {% endraw %}
)

{% raw %}
func {{.HandlerName}}(ctx *svc.ServiceContext) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        {{if .HasRequest}}var req types.{{.RequestType}}
        if err := httpx.Parse(r, &req); err != nil {
            httpx.Error(w, err)
            return
        }{{end}}

        l := logic.New{{.LogicType}}(r.Context(), ctx)
        {{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}req{{end}})
        {{if .HasResp}}response.Response(w, resp, err){{else}}response.Response(w, nil, err){{end}}//②

    }
}
{% endraw %}

① 替換為你真實(shí)的response包名,僅供參考

② 自定義模板內(nèi)容

如果本地沒(méi)有~/.goctl/api/handler.tpl文件,可以通過(guò)模板初始化命令goctl template init進(jìn)行初始化

修改模板前后對(duì)比

  • 修改前

func GreetHandler(ctx *svc.ServiceContext) http.HandlerFunc {
  return func(w http.ResponseWriter, r *http.Request) {
      var req types.Request
      if err := httpx.Parse(r, &req); err != nil {
          httpx.Error(w, err)
          return
      }

      l := logic.NewGreetLogic(r.Context(), ctx)
      resp, err := l.Greet(req)
      // 以下內(nèi)容將被自定義模板替換
      if err != nil {
          httpx.Error(w, err)
      } else {
          httpx.OkJson(w, resp)
      }
  }
}

  • 修改后

func GreetHandler(ctx *svc.ServiceContext) http.HandlerFunc {
  return func(w http.ResponseWriter, r *http.Request) {
      var req types.Request
      if err := httpx.Parse(r, &req); err != nil {
          httpx.Error(w, err)
          return
      }

      l := logic.NewGreetLogic(r.Context(), ctx)
      resp, err := l.Greet(req)
      response.Response(w, resp, err)
  }
}

修改模板前后響應(yīng)體對(duì)比

  • 修改前

{
  "message": "Hello go-zero!"
}

  • 修改后

{
  "code": 0,
  "msg": "OK",
  "data": {
      "message": "Hello go-zero!"
  }
}

總結(jié)

本文檔僅對(duì)http相應(yīng)為例講述了自定義模板的流程,除此之外,自定義模板的場(chǎng)景還有:

  • model 層添加kmq
  • model 層生成待有效期option的model實(shí)例
  • http自定義相應(yīng)格式 ...


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)