go-zero学习笔记(二)
利用goctl生成api服务
-
编写api文件
//版本信息, import中的版本信息必须与被import的api版本信息一样 syntax="v1" // 支持引入其他api文件 // 这在多接口下非常有用 // 如果不可以引入,对于多接口情况,所有的接口写在同一个文件,很容易造成混乱,阅读和修改也不太方便 // 支持引入后,可以将接口按照某一规则分组,分文件书写,这样对于后续的阅读修改都较为便利, // 搞一个主api文件,将其他文件全部引入即可 import "***.api" // info 信息 可选 info( title: "type title here" desc: "type desc here" author: "type author here" email: "type email here" version: "type version here" ) // 1. 数据类型:基本类型都支持,切片用 []数据类型 表示,也支持map, 指针,以及自定义数据类型 // 2. 标签:支持json、form、path、header // json:从请求头body中读取数据,一般在post方法中使用 // form:从请求的url的参数中读取数据,一般在get方法中使用 // path:从请求的url中读取数据,如:ID `path:"id"` 路由定义:/foo/:id url: /foo/123 会将url中的123读取到 // header:从请求的header中读取数据 // 3. 参数校验规则: 支持optional、options、default、range // optional:当前参数可选,`json:"foo,optional"` // options:当前参数仅可接收的枚举值,枚举值之间用 | 分割,`json:"gender,options=foo|bar"` // default:当前参数默认值,`json:"gender,default=male"` // range:当前参数数值有效范围,仅对数值有效,`json:"age,range=[0:120]"` type ( GetInfoReq { IDs []string `json:"IDs"` } GetInfoData { ID string `json:"ID"` Name string `json:"Name"` MD5 string `json:"md5"` Size int64 `json:"Size"` Uptime int64 `json:"uptime"` } GetInfoResp { Data []*GetInfoData `json:"data"` Msg string `json:"msg"` Code int64 `json:"code"` RequestID string `json:"requestId"` } ) // 修饰其紧挨的service块,且一个server块只能修饰一个service块 @server( prefix: api/demo/v1 // url的前缀(可选) group: demo // 群组,会在goctl生成的代码的handler、logic中体现(可选) middleware: AuthInterceptor // 中间件, 多个中间件用逗号分割(可选) // 其他关键字参考gozero官网 https://go-zero.dev/docs/tutorials 、https://go-zero.dev/docs/reference ) // 服务条目:对单个 HTTP 请求的描述,包括 @doc 语句,handler 语句,路由语句信息 // 1. @doc 对单个路由的 meta 信息描述,一般为 key-value 值, 传递给 goctl 及其插件来进行扩展生成 // 2. @handler handlerName 对单个路由的 handler 信息控制,主要用于生成 golang http.HandleFunc 的实现转换方法 // 3. 路由语句,包括请求方法,请求路径,请求体,响应体信息 // 请求方法包括:"get"| "head"| "post" | "put" | "patch" | "delete" | "connect" | "options" | "trace" // 请求路径 注意参数的标签为path时的呼应 /:id1/:id2... // 请求体、响应体可以为空 为空时可以去除括号 service demo-api { @doc( summary: "信息获取" ) @handler GetInfoHandler post /Info/get (GetInfoReq) returns (GetInfoResp) }
-
执行goctl命令
goctl api go -api ./api/demo.api -dir . -style gozero
-
执行结果
其中:
etc:静态配置文件目录
demo.go:程序启动入口文件
internal:单个服务内部文件,其可见范围仅限当前服务
config:静态配置文件对应的结构体声明目录
handler:handler 目录,可选,一般 http 服务会有这一层做路由管理,handler 为固定后缀
logic:业务目录,所有业务编码文件都存放在这个目录下面,logic 为固定后缀
svc:依赖注入目录,所有 logic 层需要用到的依赖都要在这里进行显式注入
types:结构体存放目录 -
接下来你只需要负责logic的具体实现就可以了,当前你也可以对生成的内容进行修改