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

OpenAPI路径/查询参数嵌套结构序列化

汪深
2023-03-14

在关于参数序列化的OpenAPI文档中,有一个简短的部分是关于如何序列化具有不同样式的查询、路径、标头和cookie参数。这些参数的模式被描述为OpenAPI风格的json模式,它允许对象和数组的无限嵌套。我在文档中没有找到任何关于如何处理这些的内容:

https://swagger.io/docs/specification/serialization/

让我们假设为任何参数提供的JSON模式如下所示:

{
  "type": "object",
  "properties": {
    "foo": {
      "type": "object",
      "properties": {
        "bar": "string"
      }
    }
  }
}

这意味着它允许JSON中的结构,例如:

{
  "foo": {
    "bar": "hello"
  }
}

或者与嵌套数组类似的概念:

{
  "type": "array",
  "items": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}

它允许这样的结构(至少在JSON中):

[["a"], ["b"]]

我的问题:

  1. 这是否允许根据OpenAPI规范进行路径、查询等参数?
  2. 如果是这样,是否有任何关于如何以规范允许的不同样式序列化这些的文档?
  3. 万一不是,公文中有没有提到这一点?

我问这个是因为我正在开发需要与OpenAPI规范兼容的工具,我想知道我在这里能期望什么作为参数格式。我完全意识到拥有巨大的嵌套对象并尝试在url中序列化它们不是最聪明的主意。然而,我对OpenAPI规范允许的内容感兴趣。

共有2个答案

华旭
2023-03-14

OpenAPI spec 3.0/3.1支持JSON格式的参数序列化。它只是在你提到的那一页的末尾提到了。

    < li >其他序列化方法 < li >架构与内容

来自OpenAPI规范3.0.3:

对于更复杂的情况,< code>content属性可以定义参数的媒体类型和架构。参数必须包含< code>schema属性或< code>content属性,但不能同时包含两者。

下面的OpenAPI片段显示了如何定义在问题中具有所需结构的查询参数:

  parameters:
    - name: objParam
      in: query
      content:
        application/json:
          schema:
            type: object
            properties:
              foo:
                type: object
                properties:
                  bar:
                    type: string
    - name: nestedArray
      in: query
      content:
        application/json:
          schema:
            type: array
            items:
              type: array
              items:
                type: string
薄哲
2023-03-14

简短回答:这是未定义的行为。

大多数OpenAPI序列化样式都基于RFC 6570,它只为以下方面提供指导:

  • 基元值,
  • 基元数组,
  • 简单的非嵌套对象(具有基元属性)。

对于其他类型的值(嵌套对象、包含数组的对象、嵌套数组、对象数组),行为未定义。

类似地,OpenAPI自己的深度对象样式目前仅针对简单对象定义,而不针对数组或嵌套对象定义。以下是OpenAPI规范作者/维护者的一些相关评论:

顺便问一下,我们不能让<code>deepObject</code>也用于数组有什么原因吗?[...]

达雷尔:按照你的描述支持数组是我的意图。我应该找到一些规范的实现来用作行为的指导方针,但没有抽出时间。

Ron:如果我们最终支持分解数组表示法,需要明确第一个索引是0(或1,或-1,或其他)。

(来源)

Ron:当我们在规范中定义deepObject时,我们明确选择不提及当对象中有多个级别时会发生什么,但在我们的对话中,我们使用了“不支持”。​

(来源)

有一个现有的功能请求来扩展 deepObject 以支持数组和嵌套结构:
支持具有 deepObject 样式的查询参数的深层对象

 类似资料:
  • 我正在尝试正确定义 OpenAPI 规范,以便从该规范生成 api 客户端。我已经解决了一个问题,即我们有一个复杂的查询对象,其中包含嵌套对象和对象数组,用于获取 GET 路由。 让我们以这些类为例。 和一个带有@Query decorator的get请求。 我得到的是。 我还尝试通过添加@ApiQuery装饰器来定义查询参数,它几乎可以工作。 - 但是现在我正在将重复的查询定义混入一个。有没有办

  • 我正在为我的类开发一个简单的jsp/servlet/tomcat webapp。教授要求我们使用与默认动态web项目结构略有不同的文件夹结构。他不想使用webcontent文件夹,而是想要src/main/java和src/main/webapp下的所有源代码。 当我运行应用程序时,我的欢迎文件显示良好,但当我试图访问我的servlets时,我得到: ClassNotFoundException.

  • 我正在用Swagger 2.0记录一个Rails应用程序,并使用Swagger-UI作为人类可读的文档/沙盒解决方案。 我有一个资源,客户端可以在其中存储任意元数据以供以后查询。根据 Rails 约定,查询将按如下方式提交: Rails将其转换为以下参数: 它可以很容易地用于为数据库生成适当的 子句。 Swagger里有支持这种东西的吗?我想最终让Swagger-UI提供一些方法来修改生成的请求,

  • 我问了这个问题作为对另一个问题的评论,也在mongodb-user上发布了一个问题。到目前为止没有回复,所以我求助于问一个单独的问题。 文件说明: 如果字段包含一个数组,则$in操作符选择其字段包含数组的文档,该数组至少包含一个与指定数组中的值匹配的元素(例如,等等) 我正在使用: 在MongoDB外壳中: 下面是应根据文档及其生成的结果工作的查询列表: 为什么这个不行? 为什么我需要所有的钱?

  • 我有一个这样的endpoint: 在这里,是向用户公布的关键字。但是和是任意参数。对于另一个资源,如,任意参数可以是。 在 openapi 规范中,我有 我正在使用代码生成插件 ,在服务器控制器中,我想捕获所有任意参数。如何扩展我的 openapi 规范以使参数超出。如果有一种方法可以在单个数组中获取所有查询参数,那也将有所帮助。

  • 我正在研究spring boot数据mongoDB。我在查询包含特定对象列表的嵌套文档时遇到一些问题。 模拟课 请求类 示例JSON 所需的查询输出:传入endpoint、mockName、body、params和method 从数据库中获取mockName的mock对象 在返回的模拟的请求列表中匹配endpoint、主体、参数和方法 返回符合上述所有条件的请求的响应字段 从上面的例子json: