OpenAPIv3协议主要使用在规范路由中,阅读接口文档协议介绍之前,请先了解一下规范路由:路由注册-规范路由

一、OpenAPIv3

详细的OpenAPIv3协议介绍请参考:https://swagger.io/specification/

二、g.Meta元数据

接口的元数据信息可以通过为输入结构体 embedded 方式嵌入 g.Meta 结构,并通过 g.Meta 的属性标签方式来实现。

关于元数据组件的介绍,详情请参考章节:元数据-gmeta

三、常用协议标签

输入输出结构体中的属性的标签完整支持OpenAPIv3协议,因此只要增加了对应的协议标签,那么生成的OpenAPIv3接口信息中将会自动包含该属性。

大部分的标签属性已经被Server组件自动生成,开发者需要手动设置的标签不多。

1、基础标签

常见的基础标签包括:

常见OpenAPIv3标签说明备注
path结合注册时的前缀共同构成接口URI路径用于g.Meta标识接口元数据
tags接口所属的标签,用于接口分类用于g.Meta标识接口元数据
method接口的请求方式:GET/PUT/POST/DELETE…(不区分大小写)用于g.Meta标识接口元数据
deprecated标记该接口废弃用于g.Meta标识接口元数据
summary接口/参数概要描述缩写sm
description接口/参数详细描述缩写dc
in参数的提交方式header/path/query/cookie
default参数的默认值缩写d
mime接口的MIME类型,例如multipart/form-data一般是全局设置,默认为application/json用于g.Meta标识接口元数据
type参数的类型,一般不需要设置,特殊参数需要手动设置,例如file仅用于参数属性

更多标签请参考标准的OpenAPIv3协议:https://swagger.io/specification/

2、扩展标签

OpenAPI规范里面,所有名称以x-开头的标签是开发者可自定义的扩展标签。扩展标签可以在任意的接口、属性中以Golang struct tag的形式定义,在接口文档生成时,将会作为独立的字段返回。例如:

  1. package main
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/errors/gcode"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/net/ghttp"
  8. )
  9. type GetListReq struct {
  10. g.Meta `path:"/user" tags:"User" method:"get" x-group:"User/Info" summary:"Get user list with basic info."`
  11. Page int `dc:"Page number" d:"1" x-sort:"1"`
  12. Size int `dc:"Size for per page." d:"10" x-sort:"2"`
  13. }
  14. type GetListRes struct{}
  15. type Controller struct{}
  16. func (c *Controller) GetList(ctx context.Context, req *GetListReq) (res *GetListRes, err error) {
  17. return nil, gerror.NewCode(gcode.CodeNotImplemented)
  18. }
  19. func main() {
  20. s := g.Server()
  21. s.Group("/", func(group *ghttp.RouterGroup) {
  22. group.Bind(new(Controller))
  23. })
  24. s.SetOpenApiPath("/api.json")
  25. s.SetSwaggerPath("/swagger")
  26. s.SetPort(8199)
  27. s.Run()
  28. }

执行后,访问地址 http://127.0.0.1:8199/swagger 可以查看swagger ui,访问 http://127.0.0.1:8199/api.json 可以查看对应的OpenAPIv3接口文档。其中生成的OpenAPIv3接口文档如下:

  1. {
  2. "openapi": "3.0.0",
  3. "components": {
  4. "schemas": {
  5. "main.GetListReq": {
  6. "properties": {
  7. "Page": {
  8. "default": 1,
  9. "description": "Page number",
  10. "format": "int",
  11. "properties": {},
  12. "type": "integer",
  13. "x-sort": "1"
  14. },
  15. "Size": {
  16. "default": 10,
  17. "description": "Size for per page.",
  18. "format": "int",
  19. "properties": {},
  20. "type": "integer",
  21. "x-sort": "2"
  22. }
  23. },
  24. "type": "object",
  25. "x-group": "User/Info"
  26. },
  27. "main.GetListRes": {
  28. "properties": {},
  29. "type": "object"
  30. }
  31. }
  32. },
  33. "info": {
  34. "title": "",
  35. "version": ""
  36. },
  37. "paths": {
  38. "/user": {
  39. "get": {
  40. "parameters": [
  41. {
  42. "description": "Page number",
  43. "in": "query",
  44. "name": "Page",
  45. "schema": {
  46. "default": 1,
  47. "description": "Page number",
  48. "format": "int",
  49. "properties": {},
  50. "type": "integer",
  51. "x-sort": "1"
  52. },
  53. "x-sort": "1"
  54. },
  55. {
  56. "description": "Size for per page.",
  57. "in": "query",
  58. "name": "Size",
  59. "schema": {
  60. "default": 10,
  61. "description": "Size for per page.",
  62. "format": "int",
  63. "properties": {},
  64. "type": "integer",
  65. "x-sort": "2"
  66. },
  67. "x-sort": "2"
  68. }
  69. ],
  70. "responses": {
  71. "200": {
  72. "content": {
  73. "application/json": {
  74. "schema": {
  75. "$ref": "#/components/schemas/main.GetListRes"
  76. }
  77. }
  78. },
  79. "description": ""
  80. }
  81. },
  82. "summary": "Get user list with basic info.",
  83. "tags": [
  84. "User"
  85. ],
  86. "x-group": "User/Info"
  87. },
  88. "x-group": "User/Info"
  89. }
  90. }
  91. }

可以看到,扩展标签已经生成到了接口文档中。

四、扩展OpenAPIv3信息

核心的接口信息已经自动生成,如果开发者想要更进一步完善接口信息,可以通过s.GetOpenApi()接口获取到OpenAPIv3的结构体对象,并手动填充对应的属性内容即可。我们来看一个示例,在该示例中,我们将接口中的标签进行了自定义的排序,并且增加了对每个标签的详细描述:

接口文档-OpenAPIv3 - 图1

我们可以发现通过通用的OpenAPIv3对象我们可以自定义修改其内容,并且根据它生成其他各种自定义类型的接口文档。