リクエストボディの記述
リクエストボディは通常、「作成」および「更新」操作 (POST、PUT、PATCH) で使用されます。たとえば、POST または PUT を使用してリソースを作成する場合、リクエストボディには通常、作成されるリソースの表現が含まれます。OpenAPI 3.0 では、requestBody
キーワードを使用してリクエストボディを記述します。
OpenAPI 2.0 との違い
以前に OpenAPI 2.0 を使用したことがある場合は、OpenAPI 3.0 の使用を開始するのに役立つ変更の概要を次に示します。
- ボディとフォームパラメータは
requestBody
に置き換えられました。 - 操作は、フォームデータと JSON などの他のメディアタイプの両方を消費できるようになりました。
consumes
配列は、メディアタイプをそのスキーマにマップするrequestBody.content
マップに置き換えられました。- スキーマはメディアタイプによって異なる場合があります。
anyOf
とoneOf
を使用して、代替スキーマを指定できます。- フォームデータにはオブジェクトを含めることができ、オブジェクトと配列のシリアル化戦略を指定できます。
- RFC 7231 に従って定義されたセマンティクスがないため、GET、DELETE、HEAD はリクエストボディを持つことができなくなりました。
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
を使用します。
1paths:2 /pets:3 post:4 summary: Add a new pet5
6 requestBody:7 description: Optional description in *Markdown*8 required: true9 content:10 application/json:11 schema:12 $ref: "#/components/schemas/Pet"13 application/xml:14 schema:15 $ref: "#/components/schemas/Pet"16 application/x-www-form-urlencoded:17 schema:18 $ref: "#/components/schemas/PetForm"19 text/plain:20 schema:21 type: string22
23 responses:24 "201":25 description: Created
content
はワイルドカードメディアタイプを許可します。たとえば、image/*
はすべての画像タイプを表し、*/*
はすべてのタイプを表し、機能的には application/octet-stream
と同等です。仕様を解釈する際には、特定のメディアタイプがワイルドカードメディアタイプよりも優先されます。たとえば、image/png
> image/*
> */*
となります。
1paths:2 /avatar:3 put:4 summary: Upload an avatar5 requestBody:6 content:7 image/*: # Can be image/png, image/svg, image/gif, etc.8 schema:9 type: string10 format: binary
anyOf, oneOf
OpenAPI 3.0 は anyOf
と oneOf
をサポートしているため、リクエストボディに代替スキーマを指定できます。
1requestBody:2 description: A JSON object containing pet information3 content:4 application/json:5 schema:6 oneOf:7 - $ref: "#/components/schemas/Cat"8 - $ref: "#/components/schemas/Dog"9 - $ref: "#/components/schemas/Hamster"
ファイルアップロード
ファイルアップロードの記述方法については、ファイルアップロードとマルチパートリクエストを参照してください。
リクエストボディの例
リクエストボディには example
または複数の examples
を含めることができます。example
と examples
は requestBody.content.<media-type>
オブジェクトのプロパティです。これらが指定された場合、これらの例はスキーマによって提供される例を上書きします。これは、たとえば、リクエストとレスポンスが同じスキーマを使用するが、異なる例を使用したい場合に便利です。example
は単一のインライン例を許可します。
1requestBody:2 content:3 application/json:4 schema:5 $ref: "#/components/schemas/Pet"6 example:7 name: Fluffy8 petType: dog
examples
(複数形) はより柔軟です。インライン例、$ref
参照、またはペイロード例を含む外部 URL を指定できます。各例には、ドキュメンテーション目的でオプションの summary
と description
を含めることもできます。
1requestBody:2 content:3 application/json:4 schema:5 $ref: '#/components/schemas/Pet'6 examples:7
8 dog: # <--- example name9 summary: An example of a dog10 value:11 # vv Actual payload goes here vv12 name: Fluffy13 petType: dog14
15 cat: # <--- example name16 summary: An example of a cat17 externalValue: http://api.example.com/examples/cat.json # cat.json contains {"name": "Tiger", "petType": "cat"}18
19 hamster: # <--- example name20 $ref: '#/components/examples/hamster'21
22 components:23 examples:24 hamster: # <--- example name25 summary: An example of a hamster26 value:27 # vv Actual payload goes here vv28 name: Ginger29 petType: hamster
詳細については、例の追加を参照してください。
再利用可能なボディ
リクエストボディの定義をグローバルな components.requestBodies
セクションに置き、他の場所で $ref
参照することができます。これは、複数の操作が同じリクエストボディを持つ場合に便利です。この方法で同じ定義を簡単に再利用できます。
1paths:2 /pets:3 post:4 summary: Add a new pet5 requestBody:6 $ref: '#/components/requestBodies/PetBody'7
8 /pets/{petId}9 put:10 summary: Update a pet11 parameters: [ ... ]12 requestBody:13 $ref: '#/components/requestBodies/PetBody'14
15components:16 requestBodies:17 PetBody:18 description: A JSON object containing pet information19 required: true20 content:21 application/json:22 schema:23 $ref: '#/components/schemas/Pet'
フォームデータ
「フォームデータ」という用語は、HTML フォームの送信によく使用されるメディアタイプ application/x-www-form-urlencoded
と multipart/form-data
に使用されます。
application/x-www-form-urlencoded
は、単純な ASCII テキストデータをkey=value
ペアとして送信するために使用されます。ペイロード形式はクエリパラメータに似ています。multipart/form-data
は、バイナリデータと複数のメディアタイプを単一のメッセージで送信できます (例: 画像と JSON)。各フォームフィールドは、内部 HTTP ヘッダーを持つペイロード内の独自のセクションを持っています。multipart
リクエストは通常、ファイルアップロードに使用されます。
フォームデータを説明するために、HTML の POST フォームを考えてみましょう。
1<form action="http://example.com/survey" method="post">2 <input type="text" name="name" />3 <input type="number" name="fav_number" />4 <input type="submit" />5</form>
このフォームは、フォームのエンドポイントにデータを POST します。
1POST /survey HTTP/1.12Host: example.com3Content-Type: application/x-www-form-urlencoded4Content-Length: 285
6name=Amy+Smith&fav_number=42
OpenAPI 3.0 では、フォームデータは type: object
スキーマを使用してモデル化され、オブジェクトプロパティがフォームフィールドを表します。
1paths:2 /survey:3 post:4 requestBody:5 required: true6 content:7 application/x-www-form-urlencoded:8 schema:9 type: object10 properties:11 name: # <!--- form field name12 type: string13 fav_number: # <!--- form field name14 type: integer15 required:16 - name17 - email
フォームフィールドには、プリミティブ値、配列、およびオブジェクトを含めることができます。デフォルトでは、配列は array_name=value1&array_name=value2
として、オブジェクトは prop1=value1&prop=value2
としてシリアル化されますが、OpenAPI 3.0 仕様で定義されている他のシリアル化戦略を使用することもできます。シリアル化戦略は、encoding
セクションで次のように指定されます。
1requestBody:2 content:3 application/x-www-form-urlencoded:4 schema:5 type: object6 properties:7 color:8 type: array9 items:10 type: string11 encoding:12 color: # color=red,green,blue13 style: form14 explode: false
デフォルトでは、application/x-www-form-urlencoded
ボディ内のフォームフィールド値にある予約文字 :/?#[]@!$&'()*+,;=
は、送信時にパーセントエンコードされます。これらの文字をそのまま送信するには、次のように allowReserved
キーワードを使用します。
1requestBody:2 content:3 application/x-www-form-urlencoded:4 schema:5 type: object6 properties:7 foo:8 type: string9 bar:10 type: string11 baz:12 type: string13 encoding:14 # Don't percent-encode reserved characters in the values of "bar" and "baz" fields15 bar:16 allowReserved: true17 baz:18 allowReserved: true
任意の key=value
ペアは、自由形式のスキーマを使用してモデル化できます。
1requestBody:2 content:3 application/x-www-form-urlencoded:4 schema:5 type: object6 additionalProperties: true # this line is optional
フォームデータにおける複雑なシリアル化
style
と explode
キーワードで提供されるシリアル化ルールは、プリミティブの配列とプリミティブプロパティを持つオブジェクトに対してのみ定義された動作を持ちます。ネストされた配列やフォームデータ内の JSON などのより複雑なシナリオでは、複雑なフィールドの値をエンコードするためのメディアタイプを指定するために contentType
キーワードを使用する必要があります。例として、Slack の着信 Webhook を考えてみましょう。メッセージは JSON として直接送信することも、次のように payload
という名前のフォームフィールド内に JSON データを送信することもできます (URL エンコードが適用される前)。
1payload={"text":"Swagger is awesome"}
これは次のように記述できます。
1openapi: 3.0.42info:3 version: 1.0.04 title: Slack Incoming Webhook5externalDocs:6 url: https://api.slack.com/incoming-webhooks7
8servers:9 - url: https://hooks.slack.com10
11paths:12 /services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX:13 post:14 summary: Post a message to Slack15 requestBody:16 content:17 application/json:18 schema:19 $ref: "#/components/schemas/Message"20
21 application/x-www-form-urlencoded:22 schema:23 type: object24 properties:25 payload: # <--- form field that contains the JSON message26 $ref: "#/components/schemas/Message"27 encoding:28 payload:29 contentType: application/json30
31 responses:32 "200":33 description: OK34
35components:36 schemas:37 Message:38 title: A Slack message39 type: object40 properties:41 text:42 type: string43 description: Message text44 required:45 - text
参照
お探しのものが見つかりませんでしたか? コミュニティに質問する
間違いを見つけましたか? お知らせください