当前位置: 首页 > 知识库问答 >
问题:

在swagger留档中使用对象类型查询参数

别兴国
2023-03-14

我有一个GET路由,我想在其中将url中的对象参数编码为查询字符串。

在编写 swagger 文档时,我基本上收到不允许我在查询类型参数中使用架构/对象类型的错误:

paths:
  /mypath/:
    get:
      parameters
        - in: path
          name: someParam
          description: some param that works
          required: true
          type: string
          format: timeuuid #good param, works well
        - $ref: "#/parameters/mySortingParam" #this yields an error

parameters:
  mySortingParam
    name: paging
    in: query
    description: Holds various paging attributes
    required: false
    schema:
      type: object
      properties:
        pageSize:
          type: number
        cursor:
          type: object
          properties:
            after:
              type: string
              format: string

具有对象值的请求查询参数将在实际请求中编码。

即使 swagger在屏幕顶部显示错误,对象也会在 swagger UI 编辑器中正确呈现,但是该错误浮动在文档顶部。

共有3个答案

和丰羽
2023-03-14

这是可能的,只是不适用于OpenAPI 2.0。OpenAPI 3.0在这里描述了这是如何实现的:

https://swagger . io/docs/specification/descripting-parameters/

parameters:
- in: query
  name: filter
  # Wrap 'schema' into 'content.<media-type>'
  content:
    application/json:  # <---- media type indicates how to serialize / deserialize the parameter content
      schema:
        type: object
        properties:
          type:
            type: string
          color:
            type: string

同时,您可以将查询参数作为普通的旧字符串类型,然后手动执行序列化,然后根据需要设置查询参数。这就是我一直在做的事情,直到Swagger UI完全支持OpenAPI 3.0。

柳轶
2023-03-14

现在,OpenAPI 3.0可以做到这一点。

parameters:
  - in: query
    name: values
    schema:
      type: object
      properties:
        genre_id: 
          type: integer
        author_id:
          type: integer
        title:
          type: string
      example:
       {
         "genre_id": 1,
         "author_id": 1
       }
    style: form
    explode: true

在这里,您可以使用 style分解关键字来指定应如何序列化参数。

    < li >样式定义如何分隔多个值。可能的样式取决于参数位置——路径、查询、标题或cookie。 < li>explode (true/false)指定数组和对象是否应为每个数组项目或对象属性生成单独的参数。

对于上面的示例,url 将是:

https://ebookstore.build/v1/users/books/search?genre_id=1&author_id=1 

有关使用OpenAPI v3描述参数和参数序列化的更多信息,请参阅此处。

谢洛城
2023-03-14

我不认为您可以使用“对象”作为Swagger规范中的查询参数,因为查询参数仅支持原始类型(https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types)

 类似资料:
  • 两种情况下生成的 XML 文件相同 知道为什么在生成文档时会有这种差异吗?我在搜索此内容时找不到任何相关内容。 如何(强制)将所有数据模型包含在模式部分中?非常感谢任何指针或资源。 谢谢你

  • 我收到以下错误: 路径上的架构错误。/卡/count.get.parameters[0]不完全是一个 以下是我的定义: 我知道您不能根据此问题使用架构定义: Swagger:重用枚举定义作为查询参数 我需要修改什么才能使YAML编译没有错误?

  • 我在烧瓶项目中使用Swagger留档来记录endpoint和参数。 要定义endpoint的查询参数,请执行以下操作: 我想知道该参数是否可以在文档中显示为“必需的”,就像参数是路径的一部分时一样()。 查看文档,我只发现以下内容: 但这意味着信息要在身体上,我不能用GET请求来获取。另外,我希望它作为查询参数,而不是有效载荷的一部分。 这可能吗? 谢了。

  • 无法获取如何将字符串类型的引用与数组参数中的枚举值一起使用。我可以在items键中进行引用,并且它正在工作,但Swagger产生错误:不是有效的参数定义 Web UI生成界面,但它有文本区,而不是我期望的多选框。 正确的做法是什么? 我的代码:

  • 我想在我的 rest 服务的自动生成的 swagger ui 文档中添加一个标头参数字段。我使用Spring和Spring狐。 如您所见,我已经有一个体型参数。我只想添加一个标题类型。

  • 我的REST服务中有一个搜索endpoint。我使用的是Spring Boot,所以我有一个@RestController设置,它带有一个基于搜索查询返回搜索结果的方法。这是方法定义: 我希望SwaggerUI将SearchQuery的字段作为单独的查询参数显示在UI中。它不是;它只是显示了一个通用的“查询”参数。如果我用@RequestBody注释query,那么用户可以向主体添加一个json负