卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34309本站已运行393

Gin 的 Fizz OpenAPi 生成器正在重命名类型

gin 的 fizz openapi 生成器正在重命名类型

问题内容

我创建了一个用 gin 编写的简单 api。我使用 fizz 生成 openapi 3 规范。这是我的 post 端点:

// sets user route group
func userroute(grp *fizz.routergroup) {

    // create new user
    grp.post("", []fizz.operationoption{
        fizz.summary("creates new user and sends verification mail."),
        ...
    }, tonic.handler(handlers.createuser, 201))
}

这是处理程序方法:

// Creates new user
func CreateUser(c *gin.Context, register *models.Register) error {
    ...

    return nil
}

问题在于,在生成的 json 规范中,“register”模型显示为“createuserinput”:

有什么办法可以解决这个问题吗?或者这是正常现象吗?


正确答案


根据实现,模式名称由以下语句生成: name := strings.title(op.id) + "input" (请参见下面的 23 行):

1  // setOperationParams adds the fields of the struct type t
 2  // to the given operation.
 3  func (g *Generator) setOperationParams(op *Operation, t, parent reflect.Type, allowBody bool, path string) error {
 4      if t.Kind() != reflect.Struct {
 5          return errors.New("input type is not a struct")
 6      }
 7      if err := g.buildParamsRecursive(op, t, parent, allowBody); err != nil {
 8          return err
 9      }
10      // Input fields that are neither path- nor query-bound
11      // have been extracted into the operation's RequestBody
12      // If the RequestBody is not nil, give it a name and
13      // move it to the openapi spec's components/schemas section
14      // Replace the RequestBody's schema with a reference
15      // to the named schema in components/schemas
16      if op.RequestBody != nil {
17          mt := tonic.MediaType()
18          if mt == "" {
19              mt = anyMediaType
20          }
21          sch := op.RequestBody.Content[mt].Schema
22          if sch != nil {
23              name := strings.Title(op.ID) + "Input"
24              g.api.Components.Schemas[name] = sch
25              op.RequestBody.Content[mt].Schema = &SchemaOrRef{Reference: &Reference{
26                  Ref: componentsSchemaPath + name,
27              }}
28          }
29      }

您可以使用 fizz.id 自定义操作 id,但没有办法去掉input后缀。如果您确实想以不同的方式生成模式名称,则需要分叉存储库并修改实现。

卓越飞翔博客
上一篇: 按照列表中出现的唯一元素来标记列表
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏