OpenAPI3导入
OpenAPI3 generator for woocoo
本包提供了基于OpenAPI 3.0生成Go代码的一系列工具,用于服务WooCoo的Web项目. 来帮助开发者快速的生成基于OpenAPI 3.0的API服务.
对于像支持partial class的语言(.Net/Go) ,开发者可以很方便的生成的代码中添加自己的代码.
WooCoo选择Gin作为Web框架,因此本包生成的服务端代码也是基于Gin的,Gin项目也可以使用.
概览
我们采用了 OpenAPI 提供的例子perstore.ymal
来演示本包的使用方法.查看该文档.
在该文档之上加入一些以
x-go
为前缀的扩展属性
安装woocoo cli
go install github.com/tsingsun/woocoo/cmd/woco
命令行参数说明:
NAME:
woco oasgen - a tool for generate woocoo web code from OpenAPI 3 specifications
USAGE:
woco oasgen [command options] [arguments...]
OPTIONS:
--config value, -c value 配置文件位置
--template value, -t value [ --template value, -t value ] 扩展模板文件,可以指定文件夹或文件
--client 生成客户端代码.
--help, -h show help
# 生成服务端代码, 一般服务端代码较为复杂,使用额外的配置文件.
woco oasgen -c ./oasgen/internal/integration/config.yaml
# 生成客户端代码, 默认当前目录中寻找./opanapi.yaml文件; 以当前文件夹名做为包名
woco oasgen --client
# 生成客户端代码,指定配置.
woco oasgen -c ./oasgen/internal/integration/config.yaml --client
备注
如果在monorepo中,需要指定package
参数.遇到root package or module was not found for
错误时,请检查package
参数是否正确.
接下来让我们看下配置文件内容:
# openapi 文件,可以是YAML或JSON格式
spec: "petstore.yaml"
# 生成文件位置,
target: "petstore"
# 期望的包路径,默认同target,可指定相对路径或go包名全路径
package: "petstore"
# 外部模板文件,用于一般存放自定义的模板文件
templateDir: "template"
# 类型映射,
models:
UUID:
model: github.com/google/uuid.UUID
# 映射至其他包,使用ref为key,被映射的将不会被生成Struct
'#/components/schemas/ApiResponseXX':
model: github.com/tsingsun/woocoo/cmd/woco/oasgen/internal/integration.ApiResponse
生成的代码例子可以参考petstore
生成代码结构
首先在指定包名下,会生成以下文件:
- interface.go: 根据 Operation 生成的接口定义,同时会生成一个未实现的结构体,用于快速的生成一个可运行的服务.
- model.go: 根据 Schema 生成的数据模型定义
- tag_xxx.go: 以 Tag 为单位生成 Operation 的 Reqeust 和 Response 定义
- handler.go: 服务端路由及 handler 代码
- validator.go: 服务端的数据验证代码,针对 OpenAPI 的 pattern 正则做了自定义支持
- client.go: 客户端基础代码
- api_xxx.go: 以 Tag 为单位生成的客户端调用代码
在生成的结构体字段并没有按照文档顺序,而是内部根据名称顺序做排序,这主要是由于 OpenAPI 的解析库的采用无序 Map 的原因.
请求及响应
请求
根据 Sepc 的设定,默认生成的请求代码按参数类型定义 in
分成 Path, Header, Cookie, Query, Body 等然后分别对各部分字段验证,在此采用了 gin 使用的validator.
一般不需要另行再编写针对请求的代码.
注意
由于 Gin Binding 验证器的限制,无法将全部参数定义在一个结构体中,如果具有多种不同类型的参数,采用了分组的方式,每个分组对应一个结构体以分别调用BindXXX
方法绑定请求参数.
请求参数类型及定义:
- Path: 以 Gin
/path/:
的方式定义,在生成的代码中,会将{param}
替换为%v
的形式,以便于使用fmt.Sprintf
进行格式化.
请求参数验证:
- 输入验证: 通过 Request 代码,已经内置了 openapi3 所描述的常用的格式验证.
- String/Number的最大值,最小值,长度等验证
- Dates, Times, and Duration
- Email Addresses
- Hostnames
- IP Addresses
- Regular Expressions
- 支持通过
x-go-tag-validator
扩展验证属性,具体可参考 validator 的表达式. - Enum: 采用 OneOf 对 Enum 类型验证. 目前只支持 string 类型的 Enum. 由于在 Spec 中无法知道对应的 Model 的类型, 因此不再针对请求参数去生成 Enum 类型.
- Auth验证: 这部分的未做过多的代码生成,需要结合中间件配置.
内置支持的 JWT, KeyAuth 验证.要将不验证路径配置入
exclude
中