模板修改

场景

实现统一格式的body响应,格式如下:

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

① 实际响应数据
go-zero生成的代码没有对其进行处理

新建响应包

在项目根目标里新建文件common/response

mkdir -p common/response
vim commone/response/response.go

写入以下代码

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/${goctl版本号}/api/handler.tpl

建议把模板复制到项目根目标里goctlTpl/1.4.2

将模板替换为以下内容

package {{.PkgName}}

import (
    "net/http"
    "github.com/zeromicro/go-zero/rest/httpx"
    "go-zero-demo/common/response" // ①这里是引入的包路径
    {{.ImportPackages}}
)

func {{.HandlerName}}(svcCtx *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 := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
        {{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}}//② 这里是写入的代码

        # 以下代码删除
        #if err != nil {
        #    httpx.Error(w, err)
        #} else {
        #    {{if .HasResp}}httpx.OkJson(w, resp){{else}}httpx.Ok(w){{end}}
        #}
    }
}

① 替换为你真实的response包名,仅供参考

② 自定义模板内容

如果本地没有~/.goctl/${goctl版本号}/api/handler.tpl文件,可以通过模板初始化命令goctl template init进行初始化

> 指定生成模板 goctl template init 会生成在~/.goctl/goctl版本号/handler.tpl 目录里 ,默认使用用户家目标里的模板
> 可以指定模板目标 --home=../goctlTpl  这里写*.proto文件的相对路径
> goctl api go -api *.api -dir ../  --style=goZero --home=../../goctlTpl

修改模板前后对比

修改前

func GreetHandler(svcCtx *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(), svcCtx)
        resp, err := l.Greet(&req)
        // 以下内容将被自定义模板替换
        if err != nil {
            httpx.Error(w, err)
        } else {
            httpx.OkJson(w, resp)
        }
    }
}

修改后

func GreetHandler(svcCtx *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(), svcCtx)
        resp, err := l.Greet(&req)
        response.Response(w, resp, err)
    }
}

修改模板前后响应体对比

修改前

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

修改后

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

总结

本文档仅对http相应为例讲述了自定义模板的流程,除此之外,自定义模板的场景还有:

model 层添加kmq
model 层生成待有效期option的model实例
http自定义相应格式

参考:

https://go-zero.dev/docs/tutorials/customization/template

作者:admin  创建时间:2022-10-30 08:48
最后编辑:海马  更新时间:2024-05-10 15:32