首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenAPI路径/查询参数嵌套结构序列化

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

Stack Overflow用户
提问于 2021-05-28 22:10:10
回答 2查看 2.8K关注 0票数 2

在有关参数序列化的OpenAPI文档中,有一个关于如何序列化具有不同样式的查询、路径、头和cookie参数的简短章节。这些参数的模式被描述为OpenAPI风格的json模式,它允许无限嵌套对象和数组。关于如何在文档中处理这些问题,我还没有发现任何提及:

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

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

代码语言:javascript
运行
复制
{
  "type": "object",
  "properties": {
    "foo": {
      "type": "object",
      "properties": {
        "bar": "string"
      }
    }
  }
}

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

代码语言:javascript
运行
复制
{
  "foo": {
    "bar": "hello"
  }
}

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

代码语言:javascript
运行
复制
{
  "type": "array",
  "items": {
    "type": "array",
    "items": {
      "type": "string"
    }
  }
}

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

代码语言:javascript
运行
复制
[["a"], ["b"]]

我的问题:

  1. 根据OpenAPI规范,这是否允许用于路径、查询等参数?
  2. 如果是的话,是否有关于如何以规范允许的不同样式序列化这些文档的文档?
  3. 如果不是的话,这在官方文件中有提到过吗?

我之所以问这个问题,是因为我正在开发需要与OpenAPI规范兼容的工具,我想知道作为参数格式,在这里我能期望得到什么。我非常清楚,拥有巨大的嵌套对象并试图在url中序列化它们并不是最明智的想法。然而,我对OpenAPI规范允许什么感兴趣。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-31 22:27:10

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

大多数OpenAPI 序列化样式都基于RFC 6570,而提供指导只用于:

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

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

类似地,OpenAPI自己的deepObject样式目前只适用于简单对象,而不适用于数组或嵌套对象。下面是来自OpenAPI规范作者/维护者的一些相关评论:

顺便问一下,我们为什么不能让deepObject也为数组工作呢? 达雷尔:正如你所说的,支持数组是我的意图。我应该找到一些规范的实现来作为行为的指导方针,但我并没有去研究它。 罗恩:如果我们最终支持爆炸数组表示法,那么需要清楚的是,第一个索引是0(或1,或-1,或其他什么)。

(来源)

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

(来源)

有一个现有的特性请求来扩展deepObject以支持数组和嵌套结构:

支持具有deepObject样式的查询参数的深度对象

票数 2
EN

Stack Overflow用户

发布于 2022-05-20 08:31:02

JSONspec3.0/3.1支持OpenAPI格式的参数序列化。刚才在你提到的那一页的末尾提到了。

来自OpenAPI规范3.0.3

对于更复杂的方案,content属性可以定义参数的媒体类型和架构。参数必须包含schema属性或content属性,但不能同时包含这两个属性。

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

代码语言:javascript
运行
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67745944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档