【问题标题】:OpenAPI path/query parameters nested structure serializationOpenAPI 路径/查询参数嵌套结构序列化
【发布时间】:2021-08-17 02:52:02
【问题描述】:

在有关参数序列化的 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 规范允许的内容很感兴趣。

【问题讨论】:

标签: json swagger openapi query-parameters path-parameter


【解决方案1】:

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


大多数 OpenAPI serialization styles 都基于 RFC 6570,其中 provides guidance 仅用于:

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

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


同样,OpenAPI 自己的deepObject 样式目前为defined,仅适用于简单对象,不适用于数组或嵌套对象。以下是来自 OpenAPI 规范作者/维护者的一些相关 cmets:

顺便说一句,我们不能让deepObject 也为数组工作是有原因的吗? [...]

Darrel:支持您描述的数组是我的意图。我应该找到一些规范的实现来作为行为的指导方针,但没有解决。

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

(source)

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

(source)

现有功能请求扩展 deepObject 以支持数组和嵌套结构:
Support deep objects for query parameters with deepObject style

【讨论】:

  • 感谢您的澄清!
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2012-10-21
  • 2011-02-15
  • 1970-01-01
相关资源
最近更新 更多