在有关参数序列化的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"]]我的问题:
我之所以问这个问题,是因为我正在开发需要与OpenAPI规范兼容的工具,我想知道作为参数格式,在这里我能期望得到什么。我非常清楚,拥有巨大的嵌套对象并试图在url中序列化它们并不是最明智的想法。然而,我对OpenAPI规范允许什么感兴趣。
发布于 2021-05-31 22:27:10
简短的回答:这是一种未定义的行为。
大多数OpenAPI 序列化样式都基于RFC 6570,而提供指导只用于:
对于其他类型的值(嵌套对象、包含数组的对象、嵌套数组、对象数组),行为是未定义的。
类似地,OpenAPI自己的deepObject样式目前只适用于简单对象,而不适用于数组或嵌套对象。下面是来自OpenAPI规范作者/维护者的一些相关评论:
顺便问一下,我们为什么不能让
deepObject也为数组工作呢? 达雷尔:正如你所说的,支持数组是我的意图。我应该找到一些规范的实现来作为行为的指导方针,但我并没有去研究它。 罗恩:如果我们最终支持爆炸数组表示法,那么需要清楚的是,第一个索引是0(或1,或-1,或其他什么)。
(来源)
罗恩:当我们在规范中定义
deepObject时,我们明确地选择不提及当对象中有几个级别时会发生什么,但是在我们的对话中,我们使用的是“不支持”。
(来源)
有一个现有的特性请求来扩展deepObject以支持数组和嵌套结构:
发布于 2022-05-20 08:31:02
JSONspec3.0/3.1支持OpenAPI格式的参数序列化。刚才在你提到的那一页的末尾提到了。
对于更复杂的方案,
content属性可以定义参数的媒体类型和架构。参数必须包含schema属性或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: stringhttps://stackoverflow.com/questions/67745944
复制相似问题