OAS 3 本指南适用于 OpenAPI 3.0。如果您使用 OpenAPI 2.0,请参阅我们的 OpenAPI 2.0 指南

描述请求体

请求体通常用于“创建”和“更新”操作(POST、PUT、PATCH)。例如,在使用 POST 或 PUT 创建资源时,请求体通常包含要创建的资源的表示形式。OpenAPI 3.0 提供 requestBody 关键字来描述请求体。

与 OpenAPI 2.0 的区别

如果您以前使用过 OpenAPI 2.0,以下是一些更改的摘要,以帮助您开始使用 OpenAPI 3.0
  • 正文和表单参数已替换为 requestBody
  • 操作现在可以同时使用表单数据和其他媒体类型(如 JSON)。
  • consumes 数组已替换为 requestBody.content 映射,该映射将媒体类型映射到其架构。
  • 架构可以根据媒体类型而有所不同。
  • 可以使用 anyOfoneOf 来指定备用架构。
  • 表单数据现在可以包含对象,您可以为对象和数组指定序列化策略。
  • GET、DELETE 和 HEAD 不再允许具有请求体,因为根据 RFC 7231,它没有定义的语义。

requestBody、内容和媒体类型

与 OpenAPI 2.0 不同,在 OpenAPI 2.0 中,请求体是使用 bodyformData 参数定义的,OpenAPI 3.0 使用 requestBody 关键字来区分有效负载与 参数(如查询字符串)。requestBody 更加灵活,因为它允许您使用不同的媒体类型(如 JSON、XML、表单数据、纯文本等)并为不同的媒体类型使用不同的架构。requestBodycontent 对象、一个可选的 Markdown 格式的 description 和一个可选的 required 标志(默认情况下为 false)组成。content 列出操作使用的媒体类型(如 application/json),并为每种媒体类型指定 schema请求体默认情况下是可选的。要将正文标记为必需,请使用 required: true
paths:
  /pets:
    post:
      summary: Add a new pet

      requestBody:
        description: Optional description in *Markdown*
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
          application/xml:
            schema:
              $ref: '#/components/schemas/Pet'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/PetForm'
          text/plain:
            schema:
              type: string

      responses:
        '201':
          description: Created
content 允许通配符媒体类型。例如,image/* 表示所有图像类型;*/*表示所有类型,功能上等效于 application/octet-stream。在解释规范时,特定媒体类型优先于通配符媒体类型,例如,image/png > image/* > */*
paths:
  /avatar:
    put:
      summary: Upload an avatar
      requestBody:
        content:
          image/*:    # Can be image/png, image/svg, image/gif, etc.
            schema:
              type: string
              format: binary

anyOf、oneOf

OpenAPI 3.0 支持 anyOfoneOf,因此您可以为请求体指定备用架构
      requestBody:
        description: A JSON object containing pet information
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/Cat'
                - $ref: '#/components/schemas/Dog'
                - $ref: '#/components/schemas/Hamster'

文件上传

要了解如何描述文件上传,请参阅 文件上传多部分请求

请求体示例

请求体可以具有 example 或多个 examplesexampleexamplesrequestBody.content.<media-type> 对象的属性。如果提供,这些示例将覆盖架构提供的示例。例如,如果请求和响应使用相同的架构,但您希望拥有不同的示例,这将非常方便。example 允许单个内联示例
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
            example:
              name: Fluffy
              petType: dog
examples(复数)更加灵活 - 您可以在内联示例、$ref 引用中,或者指向包含有效负载示例的外部 URL。每个示例还可以为文档目的提供可选的 summarydescription
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
            examples:

              dog:  # <--- example name
                summary: An example of a dog
                value:
                  # vv Actual payload goes here vv
                  name: Fluffy
                  petType: dog

              cat:  # <--- example name
                summary: An example of a cat
                externalValue: http://api.example.com/examples/cat.json   # cat.json contains {"name": "Tiger", "petType": "cat"}

              hamster:  # <--- example name
                $ref: '#/components/examples/hamster'

components:
  examples:
    hamster:  # <--- example name
      summary: An example of a hamster
      value:
        # vv Actual payload goes here vv
        name: Ginger
        petType: hamster
有关更多信息,请参阅 添加示例

可重用正文

您可以将请求体定义放在全局 components.requestBodies 部分,并在其他地方使用 $ref 引用它们。如果多个操作具有相同的请求体,这将非常方便 - 这样您就可以轻松地重复使用相同的定义。
paths:
  /pets:
    post:
      summary: Add a new pet
      requestBody:
        $ref: '#/components/requestBodies/PetBody'

  /pets/{petId}
    put:
      summary: Update a pet
      parameters: [ ... ]
      requestBody:
        $ref: '#/components/requestBodies/PetBody'

components:
  requestBodies:
    PetBody:
      description: A JSON object containing pet information
      required: true
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Pet'

表单数据

术语“表单数据”用于媒体类型 application/x-www-form-urlencodedmultipart/form-data,它们通常用于提交 HTML 表单。
  • application/x-www-form-urlencoded 用于将简单的 ASCII 文本数据作为 key=value 对发送。有效负载格式类似于 查询参数
  • multipart/form-data 允许提交二进制数据以及单个消息中的多种媒体类型(例如,图像和 JSON)。每个表单字段在有效负载中都有自己的部分,以及内部 HTTP 标头。multipart 请求通常用于 文件上传
为了说明表单数据,请考虑一个 HTML POST 表单
<form action="http://example.com/survey" method="post">
  <input type="text"   name="name" />
  <input type="number" name="fav_number" />
  <input type="submit"/>
</form>
此表单将数据 POST 到表单的端点
POST /survey HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 28

name=Amy+Smith&fav_number=42
在 OpenAPI 3.0 中,表单数据是使用 type: object 架构建模的,其中对象属性表示表单字段
paths:
  /survey:
    post:
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                name:          # <!--- form field name
                  type: string
                fav_number:    # <!--- form field name
                  type: integer
              required:
                - name
                - email
表单字段可以包含基本值、数组和对象。默认情况下,数组被序列化为 array_name=value1&array_name=value2,对象被序列化为 prop1=value1&prop=value2,但您可以使用 OpenAPI 3.0 规范中定义的其他序列化策略。序列化策略在 encoding 部分中指定,如下所示
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                color:
                  type: array
                  items:
                    type: string
            encoding:
              color:            # color=red,green,blue
                style: form
                explode: false
默认情况下,application/x-www-form-urlencoded 正文内表单字段值中的保留字符 :/?#[]@!$&'()*+,;= 会在发送时进行 百分比编码。要允许这些字符按原样发送,请使用 allowReserved 关键字,如下所示
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                foo:
                  type: string
                bar:
                  type: string
                baz:
                  type: string
            encoding:
              # Don't percent-encode reserved characters in the values of "bar" and "baz" fields
              bar:
                allowReserved: true
              baz:
                allowReserved: true
可以使用自由格式架构对任意 key=value 对进行建模
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              additionalProperties: true    # this line is optional

表单数据中的复杂序列化

styleexplode 关键字提供的序列化规则仅对基本类型的数组和具有基本属性的对象具有定义的行为。对于更复杂的情况,例如嵌套数组或表单数据中的 JSON,您需要使用 contentType 关键字来指定用于编码复杂字段值的媒体类型。以 Slack 入站网络钩子 为例。可以直接将消息发送为 JSON,或者将 JSON 数据发送到名为 payload 的表单字段中,如下所示(在应用 URL 编码之前)
payload={"text":"Swagger is awesome"}
这可以描述为
openapi: 3.0.0
info:
  version: 1.0.0
  title: Slack Incoming Webhook
externalDocs:
  url: https://api.slack.com/incoming-webhooks

servers:
  - url: https://hooks.slack.com

paths:
  /services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX:
    post:
      summary: Post a message to Slack
      requestBody:
        content:
        
          application/json:
            schema:
              $ref: '#/components/schemas/Message'

          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                payload:     # <--- form field that contains the JSON message
                  $ref: '#/components/schemas/Message'
            encoding:
              payload:
                contentType: application/json

      responses:
        '200':
          description: OK

components:
  schemas:
    Message:
      title: A Slack message
      type: object
      properties:
        text:
          type: string
          description: Message text
      required:
        - text

参考

RequestBody 对象

MediaType 对象

  

没有找到您要找的东西?咨询社区
发现错误?告诉我们