深色模式
go-zero接入validator/v10
go-zero自带的参数验证过于简陋,要接入validator/v10
才行。
接入
下载validator/v10
sh
go get -u github.com/go-playground/validator/v10
修改goctl模板
修改~/.goctl/{version}/api/handler.tpl
文件:
INFO
我这里把http返回的地方也改了,这里一般都要改的,参考前面的go-zero 定制response
go
package {{.PkgName}}
import (
"net/http"
{{if .HasRequest}}"github.com/go-playground/validator/v10"
"github.com/zeromicro/go-zero/rest/httpx"{{end}}
{{.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 {
Response(w, nil, err)
return
}
validate := validator.New()
if err := validate.Struct(&req); err != nil {
Response(w, nil, err)
return
}
{{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
{{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
{{if .HasResp}}Response(w, resp, err){{else}}Response(w, nil, err){{end}}
}
}
然后使用goctl api go
命令生成的handler代码,变为使用validator
验证参数了:
go
func HelloHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var req types.HelloRequest
validate := validator.New()
if err := validate.Struct(&req); err != nil {
Response(w, nil, err)
return
}
l := logic.NewHelloLogic(r.Context(), svcCtx)
resp, err := l.Hello(&req)
Response(w, resp, err)
}
}
使用
在.api
文件中,给参数添加validate
tag,用法参考validator
的文档。
例:
go
type (
LoginReq {
Account string `json:"account" validate:"required"`
Password string `json:"password" validate:"required"`
}
// ...
)