描述请求体
请求体通常用于“创建”和“更新”操作(POST、PUT、PATCH)。例如,当使用 POST 或 PUT 创建资源时,请求体通常包含要创建的资源的表示形式。OpenAPI 3.0 提供了 requestBody
关键字来描述请求体。
与 OpenAPI 2.0 的差异
如果您之前使用过 OpenAPI 2.0,这里是对更改的总结,可帮助您开始使用 OpenAPI 3.0
- body 和 form 参数已替换为
requestBody
。 - 现在,操作可以同时使用表单数据和其他媒体类型(如 JSON)。
consumes
数组已替换为requestBody.content
映射,该映射将媒体类型映射到它们的模式。- 模式可以因媒体类型而异。
anyOf
和oneOf
可用于指定备用模式。- 表单数据现在可以包含对象,并且您可以为对象和数组指定序列化策略。
- GET、DELETE 和 HEAD 不再允许有请求体,因为根据 RFC 7231,它没有定义的语义。
requestBody、content 和媒体类型
与 OpenAPI 2.0 使用 body
和 formData
参数定义请求体不同,OpenAPI 3.0 使用 requestBody
关键字来区分有效负载与参数(如查询字符串)。requestBody
更加灵活,因为它允许您使用不同的媒体类型,如 JSON、XML、表单数据、纯文本等,并为不同的媒体类型使用不同的模式。requestBody
由 content
对象、一个可选的 Markdown 格式的 description
和一个可选的 required
标志(默认为 false
)组成。content
列出操作使用的媒体类型(如 application/json
)并为每种媒体类型指定 schema
。默认情况下,请求体是可选的。要将请求体标记为必需,请使用 required: true
。
content
允许使用通配符媒体类型。例如,image/*
表示所有图像类型;*/*
表示所有类型,并且在功能上等同于 application/octet-stream
。在解释规范时,特定媒体类型优先于通配符媒体类型,例如,image/png
> image/*
> */*
。
anyOf, oneOf
OpenAPI 3.0 支持 anyOf
和 oneOf
,因此您可以为请求体指定备用模式
文件上传
请求体示例
请求体可以有一个 example
或多个 examples
。example
和 examples
是 requestBody.content.<media-type>
对象的属性。如果提供,这些示例将覆盖模式提供的示例。例如,如果请求和响应使用相同的模式,但您想拥有不同的示例,这将非常方便。example
允许一个内联示例
examples
(复数)更加灵活——您可以有一个内联示例、一个 $ref
引用,或者指向包含有效负载示例的外部 URL。每个示例还可以具有可选的 summary
和 description
,用于文档编制。
有关更多信息,请参阅添加示例。
可重用的请求体
您可以将请求体定义放在全局 components.requestBodies
部分,并在其他地方 $ref
它们。如果多个操作具有相同的请求体,这将非常方便——这样您就可以轻松地重用相同的定义。
表单数据
术语“表单数据”用于媒体类型 application/x-www-form-urlencoded
和 multipart/form-data
,它们通常用于提交 HTML 表单。
application/x-www-form-urlencoded
用于将简单的 ASCII 文本数据作为key=value
对发送。有效负载格式类似于查询参数。multipart/form-data
允许在单个消息中提交二进制数据以及多种媒体类型(例如,图像和 JSON)。每个表单字段在有效负载中都有自己的部分,其中包含内部 HTTP 标头。multipart
请求通常用于文件上传。
为了说明表单数据,请考虑一个 HTML POST 表单
此表单将数据 POST 到表单的端点
在 OpenAPI 3.0 中,表单数据使用 type: object
模式建模,其中对象属性表示表单字段
表单字段可以包含原始值、数组和对象。默认情况下,数组序列化为 array_name=value1&array_name=value2
,对象序列化为 prop1=value1&prop=value2
,但是你可以使用 OpenAPI 3.0 规范中定义的其他序列化策略。序列化策略在 encoding
部分中指定,如下所示
默认情况下,application/x-www-form-urlencoded
主体内的表单字段值中的保留字符 :/?#[]@!$&'()*+,;=
在发送时会被百分比编码。要允许这些字符按原样发送,请使用 allowReserved
关键字,如下所示
可以使用自由格式模式来建模任意的 key=value
对
表单数据中的复杂序列化
style
和 explode
关键字提供的序列化规则仅为原始数组和具有原始属性的对象定义了行为。对于更复杂的情况,例如表单数据中的嵌套数组或 JSON,你需要使用 contentType
关键字来指定用于编码复杂字段值的媒体类型。以Slack incoming webhooks为例。消息可以直接作为 JSON 发送,也可以将 JSON 数据发送到名为 payload
的表单字段中,如下所示(在应用 URL 编码之前)
这可以描述为