W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
實現統一格式的body響應,格式如下:
{
"code": 0,
"msg": "OK",
"data": {} // ①
}
① 實際響應數據
go-zero生成的代碼沒有對其進行處理
我們提前在module為greet的工程下的response包中寫一個Response方法,目錄樹類似如下:
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)
}
$ vim ~/.goctl/api/handler.tpl
將模板替換為以下內容
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 %}
① 替換為你真實的response包名,僅供參考
② 自定義模板內容
如果本地沒有~/.goctl/api/handler.tpl文件,可以通過模板初始化命令goctl template init進行初始化
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)
// 以下內容將被自定義模板替換
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)
}
}
{
"message": "Hello go-zero!"
}
{
"code": 0,
"msg": "OK",
"data": {
"message": "Hello go-zero!"
}
}
本文檔僅對http相應為例講述了自定義模板的流程,除此之外,自定義模板的場景還有:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: