关于api文件
在go-zero中,开放一个http接口,需要优先编写api文件,定义接口的请求和响应参数格式,还有一些其他信息。 参考官方文档:go-zero.dev/docs/tasks/…
不过有一些地方,在这里单独列出来,用go-zero框架,大概率都会碰到
- 非必填参数。go-zero中,默认的请求参数字段,都是必填的。 加上optional,就会变成非必填的参数
-
LoginReq { Username string `json:"username"` Password string `json:"password"` Verify string `json:"verify,optional"` CaptchaId string `json:"captchaId,optional"` }
-
- 从url中获取参数。json tag,不能写json了,要写form。
-
InfoReq { Id int64 `form:"id"` name string `form:"name"` }
-
- ["12","13] 这样的请求参数,如何定义
-
api 文件需要如下定义: post /api/xxx deleteMany([]string) returns(DeleteResp) -
在handler中,需要直接解析req.Body
func DeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req []string decoder := json.NewDecoder(r.Body) if err := decoder.Decode(&req); err != nil { result.ParamErrorResult(r, w, err) return } if len(req) < 1 { err := xerr.NewErrCode(xerr.REUQEST_PARAM_ERROR) result.ParamErrorResult(r, w, err) return } l := apiaccess.NewDeleteLogic(r.Context(), svcCtx) resp, err := l.Delete(req) result.HttpResult(r, w, resp, err) } }
-
- {"version":{"1.0":"本版一","2.0":"版本二"}} 这样的返回数据如何定义类型。使用map[string]string
-
AppManagerIndexResp{ Priv AppManagerIndexPriv `json:"priv"` Version map[string]string `json:"version"` }
-
- 多个api文件如何组织。建议把同一个group的类型定义和service定义,都放在同一个文件。公共的类型,抽离到公共的api文件中。然后,用一个api文档引入各个api文件。
- 对外的api文件内容:
syntax = "v1" info ( title: "appserver服务" desc: "appserver服务" author: "Linden" email: "linden@xxx.com" version: "v1" ) import ( //这个common.api就只能在这个导入,不然有多个文件的时候,他们都import common文件就会报错 "./api/common.api" "./api/customer.api" "./api/apiaccess.api" "./api/spmanager.api" "./api/appmanager.api" "./api/useragreement.api" ) // goctl api go -api appserver.api -dir ../ --style=goZero
- 对外的api文件内容:
关于goctl生成代码
- 如果不太喜欢默认的格式,文件风格 | go-zero Documentation,需要加上 --style参数
# 生成 lower case 文件和目录示例 $ goctl api new demo --style gozero 默认的样式,个人觉得这个格式会导致阅读困难 # 生成 snake case 文件和目录示例 $ goctl api new demo --style go_zero # 生成 camel case 文件和目录示例 $ goctl api new demo --style goZero
关于rpc的配置文件
- 当rpc里也需要配置redis的时候,要调整一下redis的配置名称。不能用
Redispackage config import "github.com/zeromicro/go-zero/zrpc" type Config struct { zrpc.RpcServerConf //这结构体中已经有Redis了。 Mysql struct { DataSource string } // 这里不能用Redis,因为zrpc.RpcServerConf中已经有了Redis了 RedisConf struct { Host string Type string Pass string Tls bool } }
关于live reload
由于Go是不支持热编译特性的,每一次代码变更后都要重新手动停止、编译、运行代码文件。非常麻烦。。。
这里就要用到air 这个提高开发效率的工具了。cosmtrek/air: ☁️ Live reload for Go apps (github.com)
基本做到了,前端开发自动编译的效果。
关于json转struct/proto工具
可以小小地提高一下效率。
在线json转struct_go在线工具集 (gotool.top)
在线json转protobuf_go在线工具集 (gotool.top)