Copyright © 2025 the Linux Foundation
この文書中のキーワード “MUST”(〜しなければならない)、 “MUST NOT”(〜してはならない)、 “REQUIRED”(必須)、 “SHALL”(〜するものとする)、 “SHALL NOT”(〜しないものとする)、 “SHOULD”(〜するのが望ましい)、 “SHOULD NOT”(〜しないのが望ましい)、 “RECOMMENDED”(推奨)、 “NOT RECOMMENDED”(非推奨)、 “MAY”(〜してもよい)、 “OPTIONAL”(任意)は、すべて大文字で記載されている場合に限り、BCP 14 [RFC2119] [RFC8174] に定める通りに解釈されます。
この文書は Apache License, Version 2.0 のもとでライセンスされています。
OpenAPI仕様(OAS)は、HTTP APIの標準化された言語非依存のインターフェースを定義し、ソースコードやドキュメントへのアクセス、ネットワークトラフィックの検査なしで、人間とコンピュータの両方がサービスの機能を発見し理解できるようにします。適切に定義されていれば、利用者は最小限の実装ロジックで、HTTPメッセージの解析およびシリアライズを通じてリモートサービスを、データモデルとして理解し、操作することができます。
OpenAPI記述(OAD)はドキュメント生成ツールによるAPI表示や、コード生成ツールによる様々なプログラミング言語用のサーバ・クライアントの自動生成、テストツール及びその他多様なユースケースに利用できます。
OpenAPIの利用例や追加資料については、[OpenAPI-Learn] をご参照ください。
OpenAPI Initiativeが公開する仕様や拡張レジストリ、そしてこの仕様の公式レンダリングについては、spec.openapis.org をご参照ください。
OpenAPI仕様のバージョンは major.minor.patch の方式で管理されます。バージョン文字列の
major.minor 部分(例:3.1)がOASの機能セットを示します。.patch
バージョンは、仕様ドキュメント自体へのエラー修正や明確化を表し、機能セットの変更ではありません。OAS 3.1 をサポートするツールは、全ての OAS 3.1.* バージョンと互換性があることが 望ましいです。パッチバージョンはツールによって考慮されるべきではなく、たとえば 3.1.0 と 3.1.1
の区別はしません。
一部のフィールドや機能は 廃止予定と表示されている場合があります。これらはそのまま仕様の一部ですが、可能な限り、新しいフィールドや機能で置き換えることを推奨します。
現時点では、そういった要素は次のメジャーバージョンまでOASに残る予定ですが、将来のマイナーバージョンで廃止要素の除去に関する方針が定められることもあります。
場合によっては、OASのminorバージョンで互換性のない変更が導入されることがありますが、これは利点が大きいと判断される場合に限られます。
この仕様では、特定の状況を 未定義 または 実装定義 の挙動と見なします。
未定義とされる挙動は、少なくとも場合によっては仕様と矛盾する結果を生じる可能性があります。これは矛盾を検出することが不可能または非現実的な場合に用いられます。実装は歴史的理由、または過去バージョンでの曖昧な記述等により未定義のシナリオをサポートしてもよいですが、その挙動は多くの場合正しい結果となるとしても、それに依存することは推奨されません。なぜなら、すべてのツールや将来のバージョンで常に動作する保証がないためです。
一方 実装定義の挙動は、仕様要件に対して複数の方法が許容されている場合に、どの方法を取るかを実装者に委ねるものです。これはAPI記述の作成者が相互運用性を最大限高めるため推奨されない曖昧な要件を文書化します。未定義の挙動と異なり、すべてのツールで同じ挙動が保証されるなら、その依存は安全です。
OpenAPI仕様に準拠するOpenAPI文書自体はJSONオブジェクトであり、JSONまたはYAML形式のいずれかで表現できます。 この仕様で示される例は簡潔のため原則YAML形式です。
仕様書中のすべてのフィールド名は大文字小文字を区別します。 マップのキーとして使用されるすべてのフィールドもこれを含みますが、明示的に大文字小文字非区別と記載されている場合は除外されます。
OASのオブジェクトは、宣言名が定められている固定フィールドと、フィールド名がパターンで定義されるパターン化フィールドの2種類のフィールドを持ちます。
パターン化フィールドは含まれているオブジェクト内で一意の名前を持たなければなりません。
備考: OpenAPI記述はYAMLまたはJSON形式で記載できますが、APIのリクエスト・レスポンスボディなどの内容がJSONやYAMLである必要はありません。
YAMLとJSON間のラウンドトリップ性(相互変換)を維持するため、YAML version 1.2の利用を推奨するとともに、[RFC9512] Section 3.4で指定された追加制約にも従うことを推奨します。
以前の仕様バージョンで推奨されていた「JSON」スキーマルールセットのYAML制限は、(名称に反して)JSONで表現できない値も含むことがありました。OAD作成者はJSON非互換なYAML値に依存すべきではありません。
OpenAPI仕様のほとんどのフィールド名・値は大文字小文字を区別するため、本ドキュメントでは区別しない名称・値がある場合は明記するよう努めています。ただし、HTTPに直接対応するフィールド名・値については、HTTPのルールに従います(この文書内で必ずしも全てに言及されているとは限りません)。
仕様全体で description フィールドは [CommonMark]
のMarkdown記法をサポートしています。OpenAPIツールがリッチテキストを表示する場合、最低限 [CommonMark-0.27]
のMarkdown構文を必ずサポートしなければなりません。セキュリティ対策のため、一部のCommonMarkまたは拡張の機能を無視することも可能です。
CommonMark 0.27を最低要件とすることで、ツール側で拡張機能を実装する余地がありますが、そのような拡張は定義上「実装定義」となり互換性は保証されません。OpenAPI記述の作成者は、そうした拡張を利用したテキストが、最低限のサポートだけを持つツールによってどのように表示されるかを考慮すべきです。
このセクションではOpenAPI記述フォーマットの構造について説明します。 この文書がフォーマットの唯一の標準的記述です。 JSONスキーマはspec.openapis.orgで参考情報として提供されています。 JSONスキーマがこのセクションと異なる場合、本セクションが優先されます。
以降の説明では、フィールドが明示的に必須またはMUST・SHALLで記述されていなければ、任意と見なすことができます。
これはOpenAPI記述のルートオブジェクトです。
必須フィールドに加え、components、paths、webhooksのうち少なくとも1つのフィールドが必ず存在しなければなりません。
| フィールド名 | 型 | 説明 |
|---|---|---|
| openapi | string |
必須。この文字列はOpenAPI仕様のバージョン番号でなければなりません。
openapiフィールドはツールによるOpenAPI文書の解釈に使用するべきです。これはinfo.version文字列とは関係なく、OpenAPI文書自体のバージョンを表すものではありません。
|
| $self | string |
この文字列は、[RFC3986] 4.1章で定義されるURI参照の形式でなければなりません。$selfフィールドはこの文書の自己割り当てURIを提供し、[RFC3986] 5.1.1章に従ってベースURIとしても機能します。実装は、このフィールドが存在する場合、このURIを用いてAPI記述のURI参照のターゲットの識別を必ずサポートしなければなりません。$selfが省略または相対だった場合のベースURI挙動はベースURIの確立を参照し、$selfを使った参照解決の例は付録Fを参照してください。
|
| info | Info Object | 必須。APIのメタデータを提供します。メタデータはツールで必要に応じて利用できます。 |
| jsonSchemaDialect | string |
このOAS文書内のスキーマオブジェクトで$schemaキーワードのデフォルト値。URI形式でなければなりません。
|
| servers | [Server Object] | 対象サーバへの接続情報を提供するServer Objectの配列です。serversフィールドが未指定または空配列の場合、デフォルト値はServer Object1つのみの配列(url値は/)となります。 |
| paths | Paths Object | APIの利用可能なパスと操作。 |
| webhooks | Map[string, Path Item
Object] |
APIの一部として受信される可能性があり、利用者が選択して実装できるWebhooks。callbacksと関連した機能で、本セクションではAPIコール以外(例えば帯域外登録など)で開始されるリクエストについて記述します。キー名は各Webhookを指す一意な文字列で、Path
Item ObjectはAPIプロバイダーが開始するリクエストおよび期待されるレスポンスを記述します。例もあります。
|
| components | Components Object | OpenAPI記述の各種オブジェクトをまとめる要素。 |
| security | [Security Requirement Object] | API全体で使用可能なセキュリティ機構の宣言。代替となるSecurity Requirement
Object一覧で、1つでも満たせばリクエスト認可されます。個別の操作でこの定義は上書きできます。リストは空または未指定でも構いません。明示的にセキュリティを任意にする場合は空のセキュリティ要件({})を配列に含めます。
|
| tags | [Tag Object] | OpenAPI記述で使われるタグ一覧と追加メタデータ。タグの順序はパースツールで任意順序付けにも使えます。Operation Objectで使われる全タグを宣言する必要はありません。宣言しないタグはランダムまたはツールのロジックで整理される場合があります。リスト内のタグ名は一意でなければなりません。 |
| externalDocs | External Documentation Object | 追加の外部ドキュメント。 |
このオブジェクトは仕様拡張で拡張可能です。
相互運用性のため、参照には$selfフィールドが存在する場合はそのURIを必ず使わなければなりません。
実装は他のURI(取得URIなど)による参照もサポート可能ですが、この挙動は相互運用性がなく、依存することは推奨されません。
OpenAPI記述(OAD)はAPIの表面構造と意味を正確に記述します。 OADは単一文書でも複数文書でもよく、これらはURI参照や暗黙的な接続を使って相互に繋がります。
パース挙動を明確にするため、OAD内の全文書はルートにOpenAPIオブジェクトまたはスキーマオブジェクトがなければならず、以降のセクションで述べる通り完全な文書としてパースする必要があります。
ルートが別のオブジェクトだったり、OAD内容と他の内容が混在する文書は実装定義または未定義の挙動となる場合があります(付録G 解析・解決ガイダンスを参照)。 本仕様では、特別な記述がない限りルートはOpenAPIオブジェクトまたはスキーマオブジェクトと見なします。
複数文書OADでは、最初にパースされるOpenAPIオブジェクトを含む文書がエントリ文書です。
OADのエントリ文書はopenapi.jsonまたはopenapi.yamlとすることが推奨されます。
OpenAPIオブジェクトは他のフォーマット(埋込フォーマット)内に埋め込むこともできます(OAS内のスキーマオブジェクトとしてJSON Schemaを埋め込む場合のように)。 埋込フォーマットは埋め込み内容のパース方法を定義する責任があります。埋込フォーマットに未対応なOAS実装は埋込OAS内容の正しいパースは保証されません。
OAD内の各文書は参照ターゲットを発見するため完全にパースしなければなりません。
この要件にはJSON
Schema仕様ドラフト2020-12のパース要件も含まれますが、ベースURIについてはURIの相対参照の指定に従います。
参照ターゲットはOpenAPIオブジェクトの$selfフィールドや、スキーマオブジェクトの$id、$anchor、$dynamicAnchorキーワードなどのフィールドで定義されます。
実装は、OADのあらゆる文書が完全にパースされるまで、参照を未解決扱いとしてはなりません。
参照解決時に対象部分だけパースした場合、その挙動は実装定義または未定義となります(詳細は断片的パースに関する注意および付録Gを参照)。
OpenAPI記述内の参照や外部ドキュメント・ライセンスなど補足情報へのURIは識別子として解決され、本仕様でURIと呼びます(API
URLとは区別)。歴史的に一部フィールドはurlと名付けられていますが、説明では「URI」用語が使われています。
文書のパースで述べた通り、いくつかのフィールドでOpenAPI文書やスキーマオブジェクトをURIに関連付けできます。そのため、参照元文書やスキーマが配置されている場所と一致しないURIを割り当てることが可能です。 これにより、ローカルファイルやセキュリティ制限・ネットワーク制約下でも同じ参照を利用できます。
特別な記載がない限り、URIフィールドはすべて[RFC3986] 4.2章の定義に従い相対参照を許容します。
相対URI参照は適切なベースURIを用いて解決します。ベースURIは[RFC3986] 5.1.1~5.1.4章と、スキーマオブジェクトの場合はJSON Schemaドラフト2020-12 8.2章の規定により決定し、付録F: ベースURI決定と参照解決の例を参照してください。
$selfが相対URI参照の場合、[RFC3986] 5.1.2~5.1.4章で規定される次のベースURIソースで解決した後、他の相対URI参照の解決に用います。
OpenAPIオブジェクトの$selfやスキーマオブジェクトの$idが未指定または相対の場合、最も一般的なベースURIソースは取得URIです。実装は文書取得をサポート可能ですが、詳細なガイダンスはセキュリティに関する考慮事項セクション参照。取得サポートされていても、ネットワーク構成やサーバ利用不可(新旧バージョン混在など)で取得できない・非推奨の場合もあります。
したがって、全実装は意図する取得URIで文書をユーザーが提供できるようにし、参照が取得したかのように解決されることを推奨します。
URIにフラグメント識別子が含まれる場合、参照先文書のフラグメント解決メカニズムに従って解決します。参照文書がJSONまたはYAML表現の場合、フラグメント識別子は[RFC6901]に準じてJSON Pointerとして解釈されるべきです。
CommonMarkのハイパーリンク内の相対参照は、表示時のコンテキストで解決されるため、API記述のコンテキストとは異なる場合があります。
この仕様のいくつかの機能では、OpenAPI記述(OAD)内の他の部分へのURIに基づかない接続を解決する必要があります。
単一文書OADでは接続は明確ですが、複数文書OADの解決処理は本セクションの制約下で実装定義です。 場合によっては明確なURIベース代替案もあり、OAD作成者は相互運用性向上のためその代替案の利用を推奨します。
Components ObjectやTag
Objectの名前を参照元(非エントリ文書)から解決する際は、ツールはエントリ文書から解決することを推奨します。
operationIdでOperation
Objectを解決する際は、パース済み全文書のOperation Objectを考慮することが推奨です。
なお、暗黙的接続解決はURI参照の解決に影響はありません。
詳細や暗黙接続を用いるフィールド・オブジェクト一覧は付録G:解析・解決ガイダンスを参照してください。
このオブジェクトはAPIのメタデータを提供します。 メタデータは必要に応じてクライアントで利用可能であり、編集・ドキュメント生成ツールで表示される場合もあります。
| フィールド名 | 型 | 説明 |
|---|---|---|
| title | string |
必須。APIのタイトル。 |
| summary | string |
APIの簡単な要約。 |
| description | string |
APIの説明。[CommonMark]記法がリッチテキスト表現として使用可能です。 |
| termsOfService | string |
API利用規約のURI。この値は必ずURI形式でなければなりません。 |
| contact | Contact Object | 公開APIの連絡先情報。 |
| license | License Object | 公開APIのライセンス情報。 |
| version | string |
必須。OpenAPI文書自体のバージョン(OpenAPI仕様のバージョンやAPI自体のバージョン、記述のバージョンとは異なります)。 |
このオブジェクトは仕様拡張で拡張できます。
title: サンプル ペット ストア アプリ
summary: ペット ストア 管理者。
description: これは ペット ストア用の サンプル サーバです。
termsOfService: https://example.com/terms/
contact:
name: API サポート
url: https://www.example.com/support
email: support@example.com
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
version: 1.0.1
公開APIの連絡先情報。
| フィールド名 | 型 | 説明 |
|---|---|---|
| name | string |
連絡先の人物または組織を識別する名前。 |
| url | string |
連絡先情報のURI。この値はMUST URI形式でなければなりません。 |
string |
連絡先の人物/組織のメールアドレス。この値はMUST メールアドレス形式でなければなりません。 |
このオブジェクトはMAYでSpecification Extensionsにより拡張可能です。
name: API Support
url: https://www.example.com/support
email: support@example.com
公開APIのライセンス情報。
| フィールド名 | 型 | 説明 |
|---|---|---|
| name | string |
REQUIRED。APIに使用されるライセンス名。 |
| identifier | string |
APIのための[SPDX-Licenses]式。identifierフィールドはurlフィールドと相互排他的です。
|
| url | string |
APIに使用されるライセンスのURI。この値はMUST
URI形式でなければなりません。urlフィールドはidentifierフィールドと相互排他的です。 |
このオブジェクトはMAYでSpecification Extensionsにより拡張可能です。
name: Apache 2.0
identifier: Apache-2.0
サーバを表すオブジェクト。
| フィールド名 | 型 | 説明 |
|---|---|---|
| url | string |
REQUIRED。ターゲットホストへのURL。
このURLはサーバ変数をサポートし、文書が提供される場所に対してホスト位置が相対であることを示すために相対であることがMAYあります。クエリおよびフラグメントはこのURLの一部であってはなりません。変数置換は{braces}で名前が付けられた変数に対して行われます。
|
| description | string |
URLで指定されたホストを説明する任意の文字列。[CommonMark] 記法はリッチテキスト表現にMAY使用できます。 |
| name | string |
URLで指定されたホストを参照するための任意の一意な文字列。 |
| variables | Map[string, Server Variable Object] |
変数名とその値のマップ。値はサーバのURLテンプレートでの置換に使用されます。 |
このオブジェクトはMAYでSpecification Extensionsにより拡張可能です。
APIエンドポイントは位置としてアクセスされるものであり、本仕様ではURLsとして記述されます。
特に指定がない限り、URLであるすべてのフィールドは[RFC3986] の定義に従う相対参照をMAY許容します(Section 4.2)。
APIはOpenAPI文書とは別個のエンティティであるため、OpenAPI文書に対するRFC3986のベースURIルールは適用されません。特に指定がない限り、相対参照はServer Objectで定義されたURLをベースURLとして解決されます。これら自身が参照文書に対して相対であることもMAYあります。
次のOpenAPI文書の取得URIが https://device1.example.com と仮定します:
openapi: 3.2.0
$self: https://apidescriptions.example.com/foo
info:
title: Example API
version: 1.0
servers:
- url: .
description: The production API on this device
- url: ./test
description: The test API on this device
API URLに関しては、OpenAPI文書を識別する$selfフィールドは無視され、代わりに取得URIが使用されます。これにより正規化された production
URL は https://device1.example.com、正規化された test URL は
https://device1.example.com/test となります。
単一のサーバは次のように記述されます:
url: https://development.gigantic-server.com/v1
description: Development server
name: dev
次は、OpenAPIオブジェクトのserversなどで複数のサーバを記述する例です:
servers:
- url: https://development.gigantic-server.com/v1
description: Development server
name: dev
- url: https://staging.gigantic-server.com/v1
description: Staging server
name: staging
- url: https://api.gigantic-server.com/v1
description: Production server
name: prod
次はサーバ設定で変数を使用する例です:
servers:
- url: https://{username}.gigantic-server.com:{port}/{basePath}
description: The production API server
name: prod
variables:
username:
# note! no enum here means it is an open value
default: demo
description: A user-specific subdomain. Use `demo` for a free sandbox environment.
port:
enum:
- '8443'
- '443'
default: '8443'
basePath:
# open meaning there is the opportunity to use special base paths as assigned by the provider, default is "v2"
default: v2
サーバのURLテンプレート置換のためのServer Variableを表すオブジェクト。
サーバURLテンプレートは以下の[ABNF]構文で定義されます。
server-url-template = 1*( literals / server-variable )
server-variable = "{" server-variable-name "}"
server-variable-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every Unicode character except { and }
literals = 1*( %x21 / %x23-24 / %x26-3B / %x3D / %x3F-5B
/ %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate
/ pct-encoded)
; any Unicode character except: CTL, SP,
; DQUOTE, "%" (aside from pct-encoded),
; "<", ">", "\", "^", "`", "{", "|", "}"
pct-encoded = "%" HEXDIG HEXDIG
ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
/ %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
/ %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
/ %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
/ %xD0000-DFFFD / %xE1000-EFFFD
iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD
ここで、literals、pct-encoded、ucschar、および iprivate の定義は
[RFC6570] から採られており、literals に関する修正は Errata 6937 を組み込んでいます。
各サーバ変数はURLテンプレート内に複数回出現してはなりません。
完全なリクエストURLの構築については Paths Object を参照してください。
| フィールド名 | 型 | 説明 |
|---|---|---|
| enum | [string] |
置換オプションが限定的な集合から選ばれる場合に使用する文字列値の列挙。配列はMUST NOT 空であってはなりません。 |
| default | string |
REQUIRED。置換に使用するデフォルト値で、代替値が提供されない場合にSHALL送信されます。もしenumが定義されている場合、この値はenumの値に含まれていなければMUSTません。なお、この挙動はSchema
Objectのdefaultキーワードと異なり、受信側の動作を記述するものではなく値をデータに挿入するものです。 |
| description | string |
サーバ変数の任意の説明。[CommonMark] 記法はリッチテキスト表現にMAY使用できます。 |
このオブジェクトはMAYでSpecification Extensionsにより拡張可能です。
OASのさまざまな側面で再利用可能なオブジェクトの集合を保持します。 Components Object 内で定義されたすべてのオブジェクトは、Components Object の外部から明示的に参照されない限りAPIに影響を与えません。
| フィールド名 | 型 | 説明 |
|---|---|---|
| schemas | Map[string, Schema
Object] |
再利用可能なSchema Objectsを保持するオブジェクト。 |
| responses | Map[string, Response
Object | Reference Object] |
再利用可能なResponse Objectsを保持するオブジェクト。 |
| parameters | Map[string, Parameter
Object | Reference Object] |
再利用可能なParameter Objectsを保持するオブジェクト。 |
| examples | Map[string, Example
Object | Reference Object] |
再利用可能なExample Objectsを保持するオブジェクト。 |
| requestBodies | Map[string, Request
Body Object | Reference Object] |
再利用可能なRequest Body Objectsを保持するオブジェクト。 |
| headers | Map[string, Header
Object | Reference Object] |
再利用可能なHeader Objectsを保持するオブジェクト。 |
| securitySchemes | Map[string, Security Scheme Object | Reference Object] |
再利用可能なSecurity Scheme Objectsを保持するオブジェクト。 |
| links | Map[string, Link Object
| Reference Object] |
再利用可能なLink Objectsを保持するオブジェクト。 |
| callbacks | Map[string, Callback
Object | Reference Object] |
再利用可能なCallback Objectsを保持するオブジェクト。 |
| pathItems | Map[string, Path Item
Object] |
再利用可能なPath Item Objectsを保持するオブジェクト。 |
| mediaTypes | Map[string, Media Type
Object | Reference Object] |
再利用可能なMedia Type Objectsを保持するオブジェクト。 |
このオブジェクトはMAYでSpecification Extensionsにより拡張可能です。
上で宣言されたすべての固定フィールドは、キーが正規表現 ^[a-zA-Z0-9\.\-_]+$ にマッチする必要があります。
フィールド名の例:
User
User_1
User_Name
user-name
my.org.User
components:
schemas:
GeneralError:
type: object
properties:
code:
type: integer
format: int32
message:
type: string
Category:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
Tag:
type: object
properties:
id:
type: integer
format: int64
name:
type: string
parameters:
skipParam:
name: skip
in: query
description: number of items to skip
required: true
schema:
type: integer
format: int32
limitParam:
name: limit
in: query
description: max records to return
required: true
schema:
type: integer
format: int32
responses:
NotFound:
description: Entity not found.
IllegalInput:
description: Illegal input for operation.
GeneralError:
description: General Error
content:
application/json:
schema:
$ref: '#/components/schemas/GeneralError'
securitySchemes:
api_key:
type: apiKey
name: api-key
in: header
petstore_auth:
type: oauth2
flows:
implicit:
authorizationUrl: https://example.org/api/oauth/dialog
scopes:
write:pets: modify pets in your account
read:pets: read your pets
個々のエンドポイントおよびそれらの操作への相対パスを保持します。 パスは完全な URL を構築するために Server Object の URL に追加されます。MAY は ACL(アクセス制御リスト(ACL)制約)のために空でもあり得ます。
| フィールドパターン | 型 | 説明 |
|---|---|---|
| /{path} | Path Item Object | 個々のエンドポイントへの相対パス。フィールド名はスラッシュ(/)で始まることがMUSTです。Server Object の url フィールドからの URL に、このパスが(相対
URL 解決なしで)追加されて完全な URL が構築されます。パスのテンプレート化が許可されています。URL
の照合時には、テンプレート化されていない具体的なパスがテンプレート化された対応物より先にマッチします。同じ階層でテンプレート名が異なるテンプレート化パスは同一であるため、存在してはならない(MUST NOT)とされます。曖昧なマッチングが発生した場合、どちらを使用するかはツール側の判断に委ねられます。 |
このオブジェクトは 仕様拡張(Specification Extensions) によって拡張されることがMAY あります。
パスのテンプレート化とは、中括弧({})で区切られたテンプレート式を使用して、URL パスの一部をパスパラメータで置き換え可能としてマークすることを指します。
パス内の各テンプレート式は、Path Item 自身および/または各 Path Item の Operation に含まれるパスパラメータに対応していることがMUSTです。例外は、ACL 制約などによりパス項目が空である場合で、その場合は一致するパスパラメータが必須ではありません。
これらのパスパラメータの値は、[RFC3986] の セクション 3
に記載されている「一般的な構文」文字(スラッシュ(/)、疑問符(?)、ハッシュ(#)など)を未エスケープで含んではいけません(MUST NOT)。文字のエスケープに関しては URL
パーセントエンコーディング を参照してください。
パスのテンプレート化は以下の [ABNF] 構文によって定義されます
path-template = "/" *( path-segment "/" ) [ path-segment ]
path-segment = 1*( path-literal / template-expression )
path-literal = 1*pchar
template-expression = "{" template-expression-param-name "}"
template-expression-param-name = 1*( %x00-7A / %x7C / %x7E-10FFFF ) ; every Unicode character except { and }
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
ここで、pchar、unreserved、pct-encoded、および sub-delims
の定義は [RFC3986]
から採られています。path-template は RFC
3986 セクション 3.3 から直接導出されています。
各テンプレート式は単一のパステンプレート内で複数回出現してはならない(MUST NOT)です。
追加のガイダンスについては 付録 C: RFC6570 ベースのシリアル化の使用 を参照してください。
次のパスを仮定すると、具体的な定義である /pets/mine が最初にマッチします:
/pets/{petId}
/pets/mine
次のパスは同一とみなされ、無効です:
/pets/{petId}
/pets/{name}
次のようなパスは曖昧な解決を引き起こす可能性があります:
/{entity}/me
/books/{id}
/pets:
get:
description: Returns all pets from the system that the user has access to
responses:
'200':
description: A list of pets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/pet'
単一のパスで利用可能な操作を説明します。 Path Item は ACL(アクセス制御リスト)制約により空であり得ます(MAY)。 パス自体はドキュメントビューアに表示されますが、どの操作やパラメータが利用可能かは分からない場合があります。
| フィールド名 | 型 | 説明 |
|---|---|---|
| $ref | string |
このパス項目の参照定義を許可します。値は URI 形式でなければならず(MUST)、参照される構造は Path Item Object の形式でなければなりません(MUST)。定義されたオブジェクトと参照されたオブジェクトの両方に Path Item Object
フィールドが存在する場合、その振る舞いは未定義です。相対参照の解決規則 を参照してください。
注意:隣接するプロパティを伴う $ref
の振る舞いは、この仕様の将来のバージョンで変更され、Reference Object
の振る舞いとより整合する可能性があります。
|
| summary | string |
このパス内のすべての操作に適用されることを意図した省略可能な文字列の要約です。 |
| description | string |
このパスのすべての操作に適用されることを意図した省略可能な文字列による説明です。リッチテキスト表現には [CommonMark] 構文をMAY 使用できます。 |
| get | Operation Object | このパスに対する GET 操作の定義。 |
| put | Operation Object | このパスに対する PUT 操作の定義。 |
| post | Operation Object | このパスに対する POST 操作の定義。 |
| delete | Operation Object | このパスに対する DELETE 操作の定義。 |
| options | Operation Object | このパスに対する OPTIONS 操作の定義。 |
| head | Operation Object | このパスに対する HEAD 操作の定義。 |
| patch | Operation Object | このパスに対する PATCH 操作の定義。 |
| trace | Operation Object | このパスに対する TRACE 操作の定義。 |
| query | Operation Object | このパスに対する QUERY 操作の定義(執筆時点での最新の IETF ドラフト(draft-ietf-httpbis-safe-method-w-body-08 またはその RFC 後継)で定義されるもの)。 |
| additionalOperations | Map[string, Operation
Object] |
このパス上の追加操作のマップ。マップのキーはリクエストで送信されるのと同じ大文字小文字を使った HTTP メソッドです。このマップは、他の固定フィールドで Operation
Object 値として定義可能なメソッドに対するエントリを含んではならない(例:post
フィールドがそのメソッドに用いられるため、POST エントリは不可)という制約があります(MUST
NOT)。 |
| servers | [Server Object] | このパス内のすべての操作をサービスする代替の servers 配列。もし OpenAPI Object レベルで
servers 配列が指定されている場合、この値で上書きされます。
|
| parameters | [Parameter Object | Reference Object] | このパスの下で記述されたすべての操作に適用されるパラメータのリスト。これらのパラメータは操作レベルで上書きできますが、操作レベルで削除することはできません。リストには重複したパラメータを含めてはならない(MUST NOT)。一意のパラメータは名前(name)と配置(location)の組み合わせで定義されます。リストは Reference Object を使用して OpenAPI Object の
components.parameters に定義されたパラメータを参照することができます。
|
このオブジェクトは 仕様拡張(Specification Extensions) によって拡張されることがMAY あります。
get:
description: Returns pets based on ID
summary: Find pets by ID
operationId: getPetsById
responses:
'200':
description: pet response
content:
'*/*':
schema:
type: array
items:
$ref: '#/components/schemas/Pet'
default:
description: error payload
content:
text/html:
schema:
$ref: '#/components/schemas/ErrorModel'
parameters:
- name: id
in: path
description: ID of pet to use
required: true
schema:
type: array
items:
type: string
style: simple
additionalOperations:
COPY:
description: Copies pet information based on ID
summary: Copies pets by ID
operationId: copyPetsById
responses:
'200':
description: pet response
content:
'*/*':
schema:
type: array
items:
$ref: '#/components/schemas/Pet'
default:
description: error payload
content:
text/html:
schema:
$ref: '#/components/schemas/ErrorModel'
パス上の単一の API 操作を説明します。
| フィールド名 | 型 | 説明 |
|---|---|---|
| tags | [string] |
API ドキュメンテーション制御のためのタグ一覧。タグはリソースやその他の識別子による操作の論理的グルーピングに使用できます。 |
| summary | string |
操作が何を行うかの短い要約。 |
| description | string |
操作の振る舞いに関する詳細な説明。[CommonMark] 構文をMAY リッチテキスト表現に使用できます。 |
| externalDocs | External Documentation Object | この操作に対する追加の外部ドキュメント。 |
| operationId | string |
操作を識別するために使用される一意の文字列。この id は API 内のすべての操作の中で一意でなければなりません(MUST)。operationId の値は大文字小文字を区別します。ツールやライブラリは操作を一意に識別するために operationId を使用することがMAYあるため、一般的なプログラミング命名規約に従うことがRECOMMENDED です。 |
| parameters | [Parameter Object | Reference Object] | この操作に適用されるパラメータのリスト。パラメータが既に Path Item
で定義されている場合、新しい定義はそれを上書きしますが、削除することはできません。リストには重複したパラメータを含めてはならない(MUST NOT)。一意のパラメータは名前(name)と配置(location)の組み合わせで定義されます。リストは Reference Object を使用して OpenAPI Object の
components.parameters に定義されたパラメータを参照することができます。 |
| requestBody | Request Body Object | Reference Object | この操作に適用されるリクエストボディ。requestBody は、HTTP 仕様 [RFC9110] の セクション 9.3
がリクエストボディの意味を明確に定義している HTTP メソッドで完全にサポートされます。それ以外の、メッセージコンテンツを推奨しない(例えば GET や DELETE
のような)場合には、requestBody は許容されますが明確な意味を持たないため、可能であれば避けるべきです(SHOULD)。
|
| responses | Responses Object | この操作を実行した際に返される可能性のあるレスポンスの一覧。 |
| callbacks | Map[string, Callback
Object | Reference Object] |
親操作に関連する可能性のあるアウトオブバンドコールバックのマップ。キーは Callback Object の一意の識別子です。マップ内の各値は API 提供者によって開始される可能性のあるリクエストと期待されるレスポンスを記述する Callback Object です。 |
| deprecated | boolean |
この操作が非推奨であることを宣言します。消費者は宣言された操作の使用を控えるべきです(SHOULD)。デフォルト値は
false です。
|
| security | [Security Requirement Object] | この操作に使用可能なセキュリティ機構を宣言します。値のリストは代替の Security Requirement Object を含みます。要求を認可するにはいずれか一つの
Security Requirement Object
を満たせば十分です。セキュリティをオプションにするには、空のセキュリティ要求({})を配列に含めることができます。この定義はトップレベルの security
をオーバーライドします。トップレベルのセキュリティ宣言を削除するには空配列を使用できます。 |
| servers | [Server Object] | この操作をサービスする代替の servers 配列。もし Path Item
Object または OpenAPI Object レベルで servers
配列が指定されている場合、本フィールドの値で上書きされます。
|
このオブジェクトは 仕様拡張(Specification Extensions) によって拡張されることがMAY あります。
tags:
- pet
summary: Updates a pet in the store with form data
operationId: updatePetWithForm
parameters:
- name: petId
in: path
description: ID of pet that needs to be updated
required: true
schema:
type: string
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
name:
description: Updated name of the pet
type: string
status:
description: Updated status of the pet
type: string
required:
- status
responses:
'200':
description: Pet updated.
content:
application/json: {}
application/xml: {}
'405':
description: Method Not Allowed
content:
application/json: {}
application/xml: {}
security:
- petstore_auth:
- write:pets
- read:pets
拡張ドキュメントのために外部リソースを参照することを可能にします。
| Field Name | Type | Description |
|---|---|---|
| description | string |
対象ドキュメントの説明です。 [CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。 |
| url | string |
REQUIRED。対象ドキュメントの URI です。これは URI の形式であることがMUSTです。 |
This object MAY be extended with Specification Extensions.
description: Find more info here
url: https://example.com
単一の操作パラメータを記述します。
一意のパラメータは name と location の組み合わせで定義されます。
パーセントエンコーディングの問題(application/x-www-form-urlencoded クエリ文字列形式との相互作用を含む)については、詳細は 付録 E を参照してください。
in フィールドで指定される可能なパラメータ配置は5つあります:
/items/{itemId} では、パスパラメータは
itemId です。
/items?id=### ではクエリパラメータは id です;MUST NOT は同じ操作(またはその操作の path-item)で in: "querystring"
パラメータと共に出現してはなりません。content
フィールドを使用して指定され、ほとんどの場合メディアタイプは application/x-www-form-urlencoded
になります。これはそのメディアタイプのリクエストボディと同様に Encoding Objects を使用できます;MUST NOT は複数回出現してはならず、また任意の in: "query"
パラメータと同じ操作(またはその操作の path-item)に出現してはなりません。パラメータのシリアライズ規則は2つの方法のいずれかで指定されます。
Parameter Objects は content フィールドか schema
フィールドのいずれか一方を必ず含めなければならず、両方を同時に含めてはなりません(MUST)。
さまざまな型の値を文字列表現に変換する議論については 付録 B を参照してください。
これらのフィールドは content または schema のいずれにもMAY
使用できます。
example と examples フィールドは相互に排他的です;検証要件については Working with Examples を参照してください。
| Field Name | Type | Description |
|---|---|---|
| name | string |
REQUIRED。パラメータの名前です。パラメータ名は大文字小文字を区別します。
|
| in | string |
REQUIRED。パラメータの配置場所です。
可能な値は "query", "querystring",
"header", "path" または "cookie" です。
|
| description | string |
パラメータの簡単な説明。使用例を含めることができます。[CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。 |
| required | boolean |
このパラメータが必須かどうかを決定します。parameter location が
"path" の場合、このフィールドはREQUIRED
であり、その値はMUST true
でなければなりません。その他の場合、このフィールドはMAY 含めることができ、デフォルト値は
false です。
|
| deprecated | boolean |
パラメータが非推奨であることを示し、使用を段階的に中止することがSHOULD 推奨されます。デフォルト値は
false です。
|
| allowEmptyValue | boolean |
もし true の場合、クライアントは省略されるはずのパラメータの代わりに長さゼロの文字列値を渡すことがMAY あります。サーバはこれをパラメータが使用されていないものとして解釈することがSHOULD 推奨されます。デフォルト値は false です。もし style が使用され、かつ behavior is n/a (cannot be serialized)
の場合、allowEmptyValue の値はSHALL
無視されます。このフィールドとパラメータの Schema Object
との相互作用は実装依存です。このフィールドは query
パラメータのみ有効です。Deprecated: このフィールドの使用はNOT RECOMMENDEDであり、将来の改訂で削除される可能性があります。 |
| example | Any | パラメータの潜在的な値の例;詳細は Working With Examples を参照してください。 |
| examples | Map[ string, Example Object | Reference Object] |
パラメータの潜在的な値の例;詳細は Working With Examples を参照してください。 |
This object MAY be extended with Specification Extensions.
Note that while "Cookie" as a name is not forbidden if in
is "header", the effect of defining a cookie parameter that way is undefined; use
in: "cookie" instead.
より単純なシナリオでは、schema と style によってパラメータの構造と構文を記述できます。
これらのフィールドは in: "querystring" と共に使用してはMUST NOT です。
schema を持つパラメータで in: "header" または
in: "cookie", style: "cookie" の場合は注意が必要です:
これらの場合、実装は引用やエスケープを試みるのではなく値をそのまま通過させることがMUST です。ヘッダの引用規則やクッキーのエスケープ慣行は広く異なるため自動的に処理できないためです;引用とエスケープに関するガイダンスは 付録 D を参照してください。
| Field Name | Type | Description |
|---|---|---|
| style | string |
パラメータ値がどのようにシリアライズされるかを、その型に応じて記述します。デフォルト値(in
の値に基づく):"query" の場合は "form";"path" の場合は
"simple";"header" の場合は
"simple";"cookie" の場合は互換性のため "form"(ただし
in: "cookie" には style: "cookie" を使用することがSHOULD 推奨されます;詳細は 付録 D を参照)。
|
| explode | boolean |
これが true の場合、array または object
型のパラメータ値は配列の各値やマップの各キーと値ごとに個別のパラメータを生成します。他の型のパラメータや style が "deepObject"
の場合、このフィールドは影響しません。style が "form" または
"cookie" のときのデフォルトは true です。それ以外のスタイルはデフォルトが
false です。
|
| allowReserved | boolean |
これが true の場合、パラメータ値は [RFC6570] の定義による reserved
expansion を使用してシリアライズされます。これにより RFC3986
の予約文字セットやパーセントエンコードされた三文字列がそのまま通過することが許されますが、他の不許可文字はパーセントエンコードされます(%
はパーセントエンコードされた三文字列の外では例外ではありません)。デフォルトは false
です。このフィールドは自動的にパーセントエンコードを行う in と style の組み合わせにのみ適用されます。
|
| schema | Schema Object | パラメータに使用される型を定義するスキーマです。 |
追加のガイダンスについては 付録 C: RFC6570 ベースのシリアル化の使用 を参照してください。
より複雑なシナリオでは、content
フィールドがパラメータのメディアタイプとスキーマを定義し、その使用例を示すことができます。
in: "querystring" と application/x-www-form-urlencoded に関しては、Encoding the
x-www-form-urlencoded Media Type を参照してください。
| Field Name | Type | Description |
|---|---|---|
| content | Map[string, Media Type Object | Reference Object] |
パラメータの表現を含むマップ。キーはメディアタイプで、値がそれを記述します。マップはMUST 1エントリのみを含む必要があります。 |
単純なパラメータをシリアライズする一般的な方法をサポートするために、一連の style 値が定義されています。この表に示されていない組み合わせは許可されません。
style |
type |
in |
Comments |
|---|---|---|---|
matrix |
primitive, array, object |
path |
Path-style パラメータは [RFC6570] の Section 3.2.7 によって定義されます。 |
label |
primitive, array, object |
path |
Label スタイルは [RFC6570] の Section 3.2.5 によって定義されます。 |
simple |
primitive, array, object |
path, header |
Simple スタイルは [RFC6570] の Section 3.2.2
によって定義されます。これは OpenAPI 2.0 の collectionFormat の csv 値に相当します。
|
form |
primitive, array, object |
query, cookie |
Form スタイルは [RFC6570] の Section 3.2.8
によって定義されます。これは OpenAPI 2.0 の collectionFormat を置き換え、explode が
false のときは csv、true のときは multi に相当します。
|
spaceDelimited |
array, object |
query |
スペースで区切られた配列値やオブジェクトのプロパティと値。これは OpenAPI 2.0 の collectionFormat の
ssv に相当します。
|
pipeDelimited |
array, object |
query |
パイプで区切られた配列値やオブジェクトのプロパティと値。これは OpenAPI 2.0 の collectionFormat の
pipes に相当します。
|
deepObject |
object |
query |
スカラーのプロパティを持つオブジェクトをフォームパラメータで表現することを可能にします。配列やオブジェクトのプロパティの表現は定義されていません(代替案は Extending Support for Querystring Formats を参照)。 |
cookie |
primitive, array, object |
cookie |
form に類似しますが、[RFC6265]
の Cookie 構文ルールに従います。つまり名前と値のペアはセミコロンと単一の空白で区切られ(例:
n1=v1; n2=v2)、パーセントエンコードや他のエスケープは適用されません;エスケープが必要なデータ値は事前にエスケープされた形で提供される必要があります。
|
すべての API URL は [RFC3986] の規則に従って正しく解析されパーセントデコードされることがMUST です。
application/x-www-form-urlencoded 形式のコンテンツ、つまり Parameter
Objects の in: "query" によって生成されるクエリ文字列も、WHATWG-URL
の規則に従って正しく解析されパーセントデコードされることがMUST です。ここには非パーセントエンコードされた +
をエスケープされたスペース文字として扱うことが含まれます。
これらの要件はパーセントデコードのルールの観点で規定されており、URI に適用されるさまざまな標準のバージョン間で一貫して寛容です。
パーセントエンコーディングは複数の箇所で行われます:
パーセントエンコーディングを行う際の最も安全な方法は、RFC3986
の「unreserved」セットに含まれないすべての文字をパーセントエンコードし、form-urlencoded
についてはチルダ文字(~)もパーセントエンコードすることです。これは form-urlencoded が作られた当時の URI
RFC([RFC1738])に由来する歴史的要件に合わせるためです。本仕様の例ではこのアプローチが使用されています。
form-urlencoded に関して、[WHATWG-URL] のエンコーディングアルゴリズムは空白を
+ としてエスケープすることを要求しますが、%20 としてパーセントエンコードすることも上記要件を満たします。RFC6570
のデフォルト(非予約)フォームスタイル拡張を使用する場合の例では %20 を優先し、それ以外は + を使用します。
予約文字は予約目的で使用される場合にパーセントエンコードしてはならず(MUST NOT)、例えば &=+ は
form-urlencoded 用、, は RFC6570
展開で非エクスプロードされた配列やオブジェクト値を区切るために使用されます。手動でパーセントエンコードを行うことでデータに非パーセントエンコードの区切り文字を挿入すると、結果は未定義であり実装が正しいデータ構造へ解析できなくなる可能性が高いです。場合によっては、パスパラメータ値に
/ を挿入することは本仕様で明示的に禁止されています。
参照:
このセクションの規則は Parameter および Header オブジェクトの両方に適用され、両者は同じメカニズムを使用します。
シリアライズされた例(例えば Example Object の serializedValue や
externalValue
フィールド)を示す場合、ほとんどの場合表示すべき値は単に値そのものであり、関連するすべてのパーセントエンコードやその他のエンコード/エスケープが適用され、さらに style
と explode 設定によって生成される区切り文字も含める必要があります。
名前がシリアライズの構築に固有に含まれる場合(例えば style: "form" による name=value
ペアや、style: "simple", explode: true の組み合わせなど)、名前および名前と値の間の区切りはMUST 含める必要があります。
matrix と label スタイルは常に先頭に区切り文字を生成し、それは常にシリアライズの有効な一部でありMUST 含める必要があります。style: "form" に対応する RFC6570
オペレータは、使用される正確な構文に応じて先頭に ? か & のいずれかを生成します。これらの先頭区切りは、クエリ文字列内での位置や URI
と application/x-www-form-urlencoded コンテンツかどうかに依存するため、個別のパラメータやメディアタイプドキュメントの例にはMUST NOT 含めてはなりません。in: "cookie", style: "form"
の場合、& も ? も正しくないので、詳細は 付録 D を参照してください。
ヘッダについては、ヘッダ名は RFC6570 由来の結果の一部ではないため、シリアライズの一部として含めてはMUST NOT
です。ただし、style: "simple", explode: "true" によって生成される名前は、個別のヘッダとしてではなくヘッダ値内に現れる形で含めます。Header Object を参照すると、複数のヘッダ値に関する通常の規則に違反する Set-Cookie
レスポンスヘッダの例表示に関する特別な規則があります。
パラメータ名 color が次のいずれかの値を持つと仮定します。右側の -> の後が Example Object の
dataValue フィールドに表示される値です:
string -> "blue"
array -> ["blue", "black", "brown"]
object -> { "R": 100, "G": 200, "B": 150 }
次の表は、各値に対する異なるシリアライズ方法の serializedValue フィールドに表示されるようなシリアライズ例を示します。
allowEmptyValue フィールドとは無関係です。undefined 列は以前の仕様での empty 列に代わるもので、RFC6570 の用語により整合させるために導入されています。これは
null など特別な処理を要する「未定義」値を指し、空文字列は未定義ではありません。
form および RFC6570 以外のクエリ文字列スタイルである spaceDelimited,
pipeDelimited, deepObject については、複数パラメータからのクエリ文字列構築に関する詳細は 付録 C を参照し、form と
cookie パラメータに関する警告は 付録 D
を参照してください。
style |
explode |
undefined |
string |
array |
object |
|---|---|---|---|---|---|
| matrix | false | ;color | ;color=blue | ;color=blue,black,brown | ;color=R,100,G,200,B,150 |
| matrix | true | ;color | ;color=blue | ;color=blue;color=black;color=brown | ;R=100;G=200;B=150 |
| label | false | . | .blue | .blue,black,brown | .R,100,G,200,B,150 |
| label | true | . | .blue | .blue.black.brown | .R=100.G=200.B=150 |
| simple | false | empty | blue | blue,black,brown | R,100,G,200,B,150 |
| simple | true | empty | blue | blue,black,brown | R=100,G=200,B=150 |
| form | false | color= | color=blue | color=blue,black,brown | color=R,100,G,200,B,150 |
| form | true | color= | color=blue | color=blue&color=black&color=brown | R=100&G=200&B=150 |
| spaceDelimited | false | n/a | n/a | color=blue%20black%20brown | color=R%20100%20G%20200%20B%20150 |
| spaceDelimited | true | n/a | n/a | n/a | n/a |
| pipeDelimited | false | n/a | n/a | color=blue%7Cblack%7Cbrown | color=R%7C100%7CG%7C200%7CB%7C150 |
| pipeDelimited | true | n/a | n/a | n/a | n/a |
| deepObject | n/a | n/a | n/a | n/a | color%5BR%5D=100&color%5BG%5D=200&color%5BB%5D=150 |
| cookie | false | color= | color=blue | color=blue,black,brown | color=R,100,G,200,B,150 |
| cookie | true | color= | color=blue | color=blue; color=black; color=brown | R=100; G=200; B=150 |
多くのフレームワークは配列インデックスをパラメータ名に付加したり、ネストしたオブジェクトの複数レベルを示したりするなど、複雑な値のためのクエリ文字列構文を定義しており、これは
deepObject の能力をはるかに超えます。
これらは標準ではなく互いに矛盾することが多いため、OAS はそれらを直接サポートしようとはしません。
in: "querystring" でそのような形式をサポートするためには次の二つの方法があります:
content と text/plain を使用し、スキーマを type: "string" として
OpenAPI の外でフォーマットを定義する。これはドキュメント化や構築・解析により多くの作業を必要としますが、OpenAPI の観点では単なる文字列として扱われるため柔軟な選択肢です。
64ビット整数の配列を持つヘッダパラメータの例:
name: X-Token
in: header
description: token to be passed as a header
required: true
schema:
type: array
items:
type: integer
format: int64
style: simple
examples:
Tokens:
dataValue:
- 12345678
- 90099
serializedValue: "12345678,90099"
展開されたオブジェクト(style: "cookie" のデフォルト)を持つクッキーパラメータの例:
name: cookie
in: cookie
style: cookie
schema:
type: object
properties:
greeting:
type: string
code:
type: integer
minimum: 0
examples:
Object:
description: |
Note that the comma (,) has been pre-percent-encoded
to "%2C" in the data, as it is forbidden in
cookie values. However, the exclamation point (!)
is legal in cookies, so it can be left unencoded.
dataValue:
greeting: Hello%2C world!
code: 42
serializedValue: "greeting=Hello%2C world!; code=42"
デフォルトの style: "form" のパーセントエンコーディング挙動に依存するクッキーパラメータの例:
name: greeting
in: cookie
schema:
type: string
examples:
Greeting:
description: |
Note that in this approach, RFC6570's percent-encoding
process applies, so unsafe characters are not
pre-percent-encoded. This results in all non-URL-safe
characters, rather than just the one non-cookie-safe
character, getting percent-encoded.
dataValue: Hello, world!
serializedValue: "greeting=Hello%2C%20world%21"
文字列値を持つパスパラメータの例:
name: username
in: path
description: username to fetch
required: true
schema:
type: string
examples:
"Edsger Dijkstra":
dataValue: edijkstra
serializedValue: edijkstra
Diṅnāga:
dataValue: diṅnāga
serializedValue: di%E1%B9%85n%C4%81ga
Al-Khwarizmi:
dataValue: "الخوارزميّ"
serializedValue: "%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D9%91"
繰り返し可能なクエリパラメータを許可するオプションの文字列クエリパラメータの例(RFC6570 がスペースを %20 として扱うためここでは %20
を使用しています;スペースを + で表す方法の指針は 付録 E を参照):
name: thing
in: query
required: false
schema:
type: array
items:
type: string
style: form
explode: true
examples:
ObjectList:
dataValue:
- one thing
- another thing
serializedValue: "thing=one%20thing&thing=another%20thing"
任意の整数型パラメータを許容するフリーフォームのクエリパラメータの例:
in: query
name: freeForm
schema:
type: object
additionalProperties:
type: integer
style: form
examples:
Pagination:
dataValue:
page: 4
pageSize: 50
serializeValue: page=4&pageSize=50
複数レベルとタイプの例を示すために content を使用してシリアライズを定義する複雑なパラメータの例 — 注意:dataValue
は両レベルで同じで通常は両方に表示する必要はありませんが、serializedValue は異なります:
in: query
name: coordinates
content:
application/json:
schema:
type: object
required:
- lat
- long
properties:
lat:
type: number
long:
type: number
examples:
dataValue:
lat: 10
long: 60
serializedValue: '{"lat":10,"long":60}'
examples:
dataValue:
lat: 10
long: 60
serializedValue: coordinates=%7B%22lat%22%3A10%2C%22long%22%3A60%7D
メディアタイプオブジェクトで管理される通常のフォームエンコーディングを使用するクエリ文字列パラメータの例。ここではスペースが RFC の規則に従って +
として扱われています(RFC6570 の %20 とは異なる);この区別に関する詳細は 付録 E
を参照してください。例はメディアタイプレベルとパラメータレベルの両方に示され、application/x-www-form-urlencoded
は定義によりクエリ文字列で使用可能であるため、シリアライズされたメディアタイプ値に追加のエンコードやエスケープは行われないことを強調しています:
in: querystring
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
foo:
type: string
bar:
type: boolean
examples:
spacesAndPluses:
description: Note handling of spaces and "+" per media type.
dataValue:
foo: a + b
bar: true
serializedValue: foo=a+%2B+b&bar=true
examples:
spacesAndPluses:
description: |
Note that no additional percent encoding is done, as this
media type is URI query string-ready by definition.
dataValue:
foo: a + b
bar: true
serializedValue: foo=a+%2B+b&bar=true
文字列全体に JSON を使用するクエリ文字列パラメータの例(単一のクエリパラメータ値としてではない)。dataValue
は両レベルに示して冗長になっていますが、実際には両方に示す必要はありません:
in: querystring
name: json
content:
application/json:
schema:
type: object
properties:
numbers:
type: array
items:
type: integer
flag:
type: [boolean, "null"]
examples:
TwoNoFlag:
description: Serialize with minimized whitespace
dataValue:
numbers:
- 1
- 2
flag: null
serializedValue: '{"numbers":[1,2],"flag":null}'
examples:
TwoNoFlag:
dataValue:
numbers:
- 1
- 2
flag: null
serializedValue: "%7B%22numbers%22%3A%5B1%2C2%5D%2C%22flag%22%3Anull%7D"
パスが /foo、サーバが https://example.com の場合、serializedValue
の値を組み込んだ完全な URL は次のようになります:
https://example.com/foo?%7B%22numbers%22%3A%5B1%2C2%5D%2C%22flag%22%3Anull%7D
JSONPath を使用するクエリ文字列パラメータの例。ここでは dataValue を繰り返さず、media type
レベルでは文字列としてそのままシリアライズされるので短縮された example を使用しています:
in: querystring
name: selector
content:
application/jsonpath:
schema:
type: string
example: $.a.b[1:1]
examples:
Selector:
serializedValue: "%24.a.b%5B1%3A1%5D"
執筆時点で JSON Schema データモデルと JSONPath の間に登録されたマッピングがないため、文字列の許される構造の詳細は人間が読める description
フィールドで伝えるか、OpenAPI 記述の外側の仕組み(例えばクエリ対象データ構造のための JSON Schema)を通じて伝える必要があります。
パスが /foo、サーバが https://example.com の場合、serializedValue
の値を組み込んだ完全な URL は次のようになります:
https://example.com/foo?%24.a.b%5B1%3A1%5D
単一のリクエストボディを記述します。
| Field Name | Type | Description |
|---|---|---|
| description | string |
リクエストボディの簡潔な説明です。使用例を含めることがあります。[CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。 |
| content | Map[string, Media
Type Object | Reference Object] |
REQUIRED。リクエストボディのコンテンツ。キーはメディアタイプまたは media type range
であり、値がその内容を記述します。マップは少なくとも1つのエントリを持つことがSHOULD
推奨されます;もし持たない場合、その振る舞いは実装依存です。複数のキーにマッチするリクエストでは、最も具体的なキーのみが適用されます。例:"text/plain"
は "text/*" を上書きします。
|
| required | boolean |
リクエストにおいてリクエストボディが必須かどうかを決定します。デフォルトは false です。
|
This object MAY be extended with Specification Extensions.
参照されたスキーマ定義を用いるリクエストボディの例です。
description: user to add to the system
content:
application/json:
schema:
$ref: '#/components/schemas/User'
examples:
user:
summary: User example
externalValue: https://foo.bar/examples/user-example.json
application/xml:
schema:
$ref: '#/components/schemas/User'
examples:
user:
summary: User example in XML
externalValue: https://foo.bar/examples/user-example.xml
text/plain:
examples:
user:
summary: User example in plain text
externalValue: https://foo.bar/examples/user-example.txt
'*/*':
examples:
user:
summary: User example in other format
externalValue: https://foo.bar/examples/user-example.whatever
各 Media Type Object は、そのキーで識別されるメディアタイプに従って構造化されたコンテンツを記述します。 複数の Media Type Object は、いくつかの異なるメディアタイプのいずれかで現れる可能性のあるコンテンツを記述するために使用できます。
example または examples
が提供されている場合、例は指定されたスキーマに一致し、メディアタイプとそのエンコーディングで指定された正しい形式であることがSHOULD 推奨されます。
example と examples のフィールドは相互排他的です。
非JSON/YAML 値を含む異なる例の指定方法に関する追加のガイダンスは Working With Examples
を参照してください。
| Field Name | Type | Description |
|---|---|---|
| schema | Schema Object | リクエスト、レスポンス、パラメータ、またはヘッダの完全なコンテンツを記述するスキーマです。 |
| itemSchema | Schema Object | 順次的メディアタイプ 内の各アイテムを記述するスキーマです。 |
| example | Any | メディアタイプの例;詳細は Working With Examples を参照してください。 |
| examples | Map[ string, Example
Object | Reference Object] |
メディアタイプの例;詳細は Working With Examples を参照してください。 |
| encoding | Map[string, Encoding
Object] |
プロパティ名とそのエンコーディング情報との間のマップ(Encoding By Name
で定義)。encoding フィールドは、メディアタイプが multipart または
application/x-www-form-urlencoded の場合にのみ適用されることがSHALL です。プロパティに対して Encoding Object が指定されない場合、その振る舞いは Encoding
Object のドキュメント化されたデフォルト値によって決まります。prefixEncoding または
itemEncoding が存在する場合、このフィールドはMUST NOT 存在してはなりません。
|
| prefixEncoding | [Encoding Object] | 位置ベースのエンコーディング情報の配列(Encoding By Position
で定義)。prefixEncoding フィールドは、メディアタイプが multipart
の場合にのみ適用されることがSHALL です。プロパティに対して Encoding Object
が指定されない場合、その振る舞いは Encoding Object のドキュメント化されたデフォルト値によって決まります。encoding
が存在する場合、このフィールドはMUST NOT 存在してはなりません。
|
| itemEncoding | Encoding Object | 複数の配列アイテムに対してエンコーディング情報を提供する単一の Encoding Object(Encoding
By Position で定義)。itemEncoding フィールドは、メディアタイプが
multipart の場合にのみ適用されることがSHALL です。プロパティに対して
Encoding Object が指定されない場合、その振る舞いは Encoding Object
のドキュメント化されたデフォルト値によって決まります。encoding が存在する場合、このフィールドはMUST NOT 存在してはなりません。
|
This object MAY be extended with Specification Extensions.
メディアタイプは IANA media types registry に公開登録されており、その手続きは [RFC6838] に記載されています。
API は GitHub の application/vnd.github.v3+json
のようなプライベートメディアタイプを定義することもあり、必ずしも登録されていないメディアタイプや、後に広く使われるようになった application/schema+json
のようなものも存在します。
さまざまなメディアタイプでスキーマを使用する際の指針については、Schema Object の下の Parsing and Serializing を参照してください。
OpenAPI Initiative は、この仕様で期待されるメディアタイプのサポートを要約し、各メディアタイプに関連する節への索引を提供する Media Type Registry を維持しています。レジストリは IANA 登録(存在する場合)や各メディアタイプに関連する主要な仕様文書へのリンクも含みます。 このレジストリに追加される拡張や他の OpenAPI 仕様の後続バージョン向けの追加メディアタイプは、本バージョンの OAS 実装でサポートされることがMAYあります。
schema フィールドは、メディアタイプおよびコンテキスト(Request Body Object、Response Object、Parameter Object、または
Header Object によって定義される)で定義される完全なコンテンツに適用されることがMUST です。
これはコンテンツをメモリに完全に読み込むことを要求するため、ストリーミングコンテンツには課題をもたらします。
クライアントが読み取りをいつ止めるかを選択することが想定されるユースケースは特に困難で、ストリームの終了が明確でないためです。
本仕様内では、順次的メディアタイプ はヘッダ、フッタ、エンベロープ、その他のメタデータを持たず、繰り返し構造のみからなる任意のメディアタイプとして定義されます。
順次的メディアタイプの例(IANA 登録されていないが一般的に使用されるものを含む)には次が挙げられます:
application/jsonl
application/x-ndjson
application/json-seq
application/geo+json-seq
text/event-stream
multipart/mixed
上の最初の3つでは、繰り返される構造は任意の JSON value です。
4番目は application/geo+json 構造の値を繰り返し、text/event-stream は Server-Sent
Events に関連するカスタムテキスト形式を繰り返します。最後の multipart/mixed
は任意のメディアタイプのドキュメントの順序付けられた一覧を提供し、時にストリームされます。
multipart 形式は技術的にはプレアンブルやエピローグを許しますが、RFC はそれらを無視するよう指示しており、本仕様ではそれらをモデリングしていません。
実装は、順次的メディアタイプを JSON Schema データモデルにマッピングする際、それらの値を同じ順序の配列として扱うことで対応することがMUST です。
順次的メディアタイプをストリーミング文脈で扱う際の詳細(text/event-stream コンテンツに対する特別考慮を含む)は Complete vs Streaming Content
を参照してください。multipart タイプについては Encoding By
Position も参照してください。
itemSchema フィールドは、順次的メディアタイプのストリーミングユースケースをサポートするために提供されており、対応するエンコーディングメカニズムとして
itemEncoding が位置ベースの multipart メディアタイプ向けに用意されています(positional multipart media types を参照)。
schema
が完全なコンテンツに適用されるのに対し(前述の順次的メディアタイプのセクションで配列として扱われる)、itemSchema
はストリーム内の各アイテムに個別に適用されることがMUST であり、読み取られるごとに各アイテムを処理できることをサポートします。
schema と itemSchema の両方を同じ Media Type Object で使用することはMAY ですが、通常は schema フィールド内で items
キーワードを使うのと比べて大きな利点はありません。
maxLength
キーワードは、文字列データ(エンコードされたバイナリデータを含む)または非エンコードのバイナリデータで構成されるストリーミングペイロードの想定上限を設定するためにMAY 使用できます。
非エンコードのバイナリデータの場合、長さはオクテット数です。
このユースケースでは、JSON Schema がバイナリデータに直接適用されないため、maxLength は通常の JSON Schema
評価の外で実装されることがMAY ありますし、エンコードされたバイナリストリームを完全にメモリに保持するのは現実的でない場合があります。
text/event-stream に関しては、実装は text/event-stream
specification に従ってパースされた後のイベントデータを扱うことがMUST
です。これは特定のフィールド(コメントを含む)や値を無視する指針や、複数行に分割された値を結合する指針を含みます。
フィールド値の型は text/event-stream 仕様で指定されているとおりに扱うことがMUST
です(例:retry フィールド値は JSON 数値としてモデル化され、JSON Schema の type: integer
を期待されます)。明示的な値型が与えられていないフィールドは文字列として扱うことがMUST です。
text/event-stream の一部の利用者は、特に data フィールドに対して、フィールド値として JSON
を使用することがあります。そのような場合、文字列エンコードされたデータの内容を扱うために JSON Schema のキーワード(特に contentMediaType と
contentSchema)を使用して、pattern といった文字列関連の検証キーワードより詳細に記述・検証してください。なお
contentSchema はデフォルトで自動的に検証されないことに注意してください(本仕様の Non-validating constraint keywords セクションも参照)。
以下の Schema Object は、この文書執筆時点で [HTML] 仕様により文書化された text/event-stream
メディアタイプ向けの一般的なスキーマの例です:
type: object
required:
- data
properties:
data:
type: string
event:
type: string
id:
type: string
retry:
type: integer
minimum: 0
これらのエンコーディングフィールドは、各 Encoding Object をデータ内の特定の値にどのようにマップするかを定義します。 各フィールドはそれぞれ使用できるメディアタイプの集合を持ち、それ以外のメディアタイプに対してはこれら三つのフィールドはすべてSHALL 無視されます。
encoding フィールドの挙動はウェブフォームをサポートするように設計されているため、繰り返し値を許す名前と値のペアとして構造化されたメディアタイプ、特に
application/x-www-form-urlencoded と multipart/form-data
に対してのみ定義されています。
encoding フィールドを使用するためには、フィールド下の各キーがプロパティとして存在することがMUST
です;対応するプロパティを持たない encoding エントリはSHALL 無視されます。
配列プロパティは、与えられた Encoding Object を適用して各配列アイテムごとに同じ name
を持つエンコード済み値を1つずつ生成する方法で処理されることがMUST です(これは複数の値をフォームフィールドに供給することを推奨する
[RFC7578]
の指針に沿います)。その他の値型については、トップレベルの非配列プロパティや配列内の値を含め、Encoding Object は値全体に適用されることがMUST です。
これらの name-value ペアの順序は実装依存です。
application/x-www-form-urlencoded については、エンコーディングキーはパラメータ名にマップされ、値は Encoding Object のルールに従って生成されることがMUST
です。
ガイダンスと例(encoding フィールドの有無に関わらず)は Encoding the
x-www-form-urlencoded Media Type を参照してください。
multipart については、エンコーディングキーは各パートの Content-Disposition: form-data ヘッダの name parameter
にマップされることがMUST です(これは multipart/form-data に対して [RFC7578] で定義されています)。
非ASCII のパート名に関するガイダンスは [RFC7578] の Section 5 を参照してください。
エンコーディングフィールドを伴う場合・伴わない場合のさらなるガイダンスと例は Encoding
multipart Media Types を参照してください。
ほとんどの multipart メディアタイプ(基礎となるルールを定義する multipart/mixed
を含む)は、名前付きパートを持ちません。これらのメディアタイプのデータは配列としてモデル化され、各パートに対して順序どおりに1アイテムが対応します。
prefixEncoding および/または itemEncoding
フィールドを使用するには、itemSchema または配列の schema が存在することがMUST です。
これらのフィールドは prefixItems と items の JSON Schema
キーワードに類似しており、prefixEncoding(存在する場合)はデータ配列内の同じ位置の値に適用される Encoding Object
の配列を提供し、itemEncoding は配列中の残りのアイテムすべてに対して単一の Encoding Object を適用します。
prefixItems と同様に、インスタンス配列が prefixEncoding 配列より短くてもエラーではなく、追加の Encoding
Object は無視されることがSHALL です。
itemEncoding フィールドは itemSchema と共に使用してストリーミング multipart
コンテンツをサポートすることもできます。
prefixEncoding フィールドは任意の multipart コンテンツで固定のパート順序を要求するために使用できます。
これには multipart/form-data も含まれ、プロパティ名が存在しないため Encoding Object の headers
フィールドを使用して Content-Disposition とパート名を提供する必要があることに注意してください。
本仕様の以前のバージョンでは、multipart/form-data 以外の multipart メディアタイプで
encoding フィールドの制限を回避するために各パートの Content-Disposition: form-data ヘッダの name parameter
を使用することが推奨されていました。実装はこの回避策をサポートすることがMAY ありますが、この使用法は一般的ではないため、非
form-data の multipart メディアタイプの実装がこれをサポートする可能性は低いです。
フォーム関連および multipart メディアタイプの例については、Encoding Object
を参照してください。
この例は YAML で記述されているため、Example Object の value フィールドは JSON への自明な変換が可能な限り YAML
としてフォーマットできます。これにより JSON を文字列として埋め込む必要がなくなります。
application/json:
schema:
$ref: '#/components/schemas/Pet'
examples:
cat:
summary: An example of a cat
value:
name: Fluffy
petType: Cat
color: White
gender: male
breed: Persian
dog:
summary: An example of a dog with a cat's name
value:
name: Puma
petType: Dog
color: Black
gender: Female
breed: Mixed
frog:
$ref: '#/components/examples/frog-example'
あるいは、すべての JSON は有効な YAML であるため、例の値は YAML ドキュメント内で JSON 構文を使ってもかまいません:
application/json:
schema:
$ref: '#/components/schemas/Pet'
examples:
cat:
summary: An example of a cat
value: {
"name": "Fluffy",
"petType": "Cat",
"color": "White",
"gender": "male",
"breed": "Persian"
}
dog:
summary: An example of a dog with a cat's name
value: {
"name": "Puma",
"petType": "Dog",
"color": "Black",
"gender": "Female",
"breed": "Mixed"
}
frog:
$ref: '#/components/examples/frog-example'
アイテムが JSON 値である任意の 順次的メディアタイプ において、各値の変換は不要です。JSON Text
Sequences([RFC7464] の
application/json-seq や [RFC8091]
の +json-seq 構造接尾辞)、JSON
Lines(application/jsonl)、および NDJSON(application/x-ndjson)はこのカテゴリに含まれます。JSON
Lines と NDJSON のメディアタイプは IANA に登録されていませんが、広く使われています。
次の例は、ストリーミングログエントリとクエリに対する固定長セットの両方のための Media Type Object を示します。これは schema と
itemSchema の関係と、それぞれを使用する場合を示しています(例フィールドはどちらの場合も同じです)。
components:
schemas:
LogEntry:
type: object
properties:
timestamp:
type: string
format: date-time
level:
type: integer
minimum: 0
message:
type: string
Log:
type: array
items:
$ref: "#/components/schemas/LogEntry"
maxItems: 100
examples:
LogJSONSeq:
summary: Log entries in application/json-seq
# JSON Text Sequences require an unprintable character
# that cannot be escaped in a YAML string, and therefore
# must be placed in an external document shown below
externalValue: examples/log.json-seq
LogJSONPerLine:
summary: Log entries in application/jsonl or application/x-ndjson
description: JSONL and NDJSON are identical for this example
# Note that the value must be written as a string with newlines,
# as JSONL and NDJSON are not valid YAML
value: |
{"timestamp": "1985-04-12T23:20:50.52Z", "level": 1, "message": "Hi!"}
{"timestamp": "1985-04-12T23:20:51.37Z", "level": 1, "message": "Bye!"}
responses:
LogStream:
description: |
A stream of JSON-format log messages that can be read
for as long as the application is running, and is available
in any of the sequential JSON media types.
content:
application/json-seq:
itemSchema:
$ref: "#/components/schemas/LogEntry"
examples:
JSON-SEQ:
$ref: "#/components/examples/LogJSONSeq"
application/jsonl:
itemSchema:
$ref: "#/components/schemas/LogEntry"
examples:
JSONL:
$ref: "#/components/examples/LogJSONPerLine"
application/x-ndjson:
itemSchema:
$ref: "#/components/schemas/LogEntry"
examples:
NDJSON:
$ref: "#/components/examples/LogJSONPerLine"
LogExcerpt:
description: |
A response consisting of no more than 100 log records,
generally as a result of a query of the historical log,
available in any of the sequential JSON media types.
content:
application/json-seq:
schema:
$ref: "#/components/schemas/Log"
examples:
JSON-SEQ:
$ref: "#/components/examples/LogJSONSeq"
application/jsonl:
schema:
$ref: "#/components/schemas/Log"
examples:
JSONL:
$ref: "#/components/examples/LogJSONPerLine"
application/x-ndjson:
schema:
$ref: "#/components/schemas/Log"
examples:
NDJSON:
$ref: "#/components/examples/LogJSONPerLine"
我々の application/json-seq の例は、改行と YAML
ブロックリテラルでエスケープできない非表示のレコードセパレータ(0x1E)を含むため外部文書である必要があります:
0x1E{
"timestamp": "1985-04-12T23:20:50.52Z",
"level": 1,
"message": "Hi!"
}
0x1E{
"timestamp": "1985-04-12T23:20:51.37Z",
"level": 1,
"message": "Bye!"
}
この例では、Special Considerations for
Server-Sent Events セクションで提供された一般的なイベントスキーマが #/components/schemas/Event
にあると仮定します:
description: A request body to add a stream of typed data.
required: true
content:
text/event-stream:
itemSchema:
$ref: "#/components/schemas/Event"
required: [event]
oneOf:
- properties:
event:
const: addString
- properties:
event:
const: addInt64
data:
$comment: |
Since the `data` field is a string,
we need a format to signal that it
should be handled as a 64-bit integer.
format: int64
- properties:
event:
const: addJson
data:
$comment: |
These content fields indicate
that the string value should
be parsed and validated as a
JSON document (since JSON is not
a binary format, `contentEncoding`
is not needed)
contentMediaType: application/json
contentSchema:
type: object
required: [foo]
properties:
foo:
type: integer
上記の例に対する有効なリクエストボディの例として、次の text/event-stream ドキュメントが挙げられます:
event: addString
data: This data is formatted
data: across two lines
retry: 5
event: addInt64
data: 1234.5678
unknownField: this is ignored
: This is a comment
event: addJSON
data: {"foo": 42}
このストリームの処理をより明確に示すため、以下は同等の JSON Lines ドキュメントです。数値や JSON データが文字列として扱われ、未知のフィールドやコメントが無視されスキーマ検証に渡されないことを示しています:
{"event": "addString", "data": "This data is formatted\nacross two lines", "retry": 5}
{"event": "addInt64", "data": "1234.5678"}
{"event": "addJSON", "data": "{\"foo\": 42}"}
OpenAPI 2.0 と対照して、OAS 3.x では file 入出力コンテンツは他のスキーマ型と同じ意味で記述されます。
OAS 3.0 と対照して、OAS 3.1 では format キーワードはスキーマのコンテンツエンコーディングに影響を及ぼしません。代わりに JSON Schema の
contentEncoding と contentMediaType
キーワードが使用されます。さまざまなシナリオをこれらのキーワードでモデル化する方法や、以前の format 使用法からの移行については Working With Binary Data を参照してください。
例:
バイナリ(オクテットストリーム)で転送されるコンテンツは schema を省略できることがMAY あります:
# a PNG image as a binary file:
content:
image/png: {}
# an arbitrary binary file:
content:
application/octet-stream: {}
# arbitrary JSON without constraints beyond being syntactically valid:
content:
application/json: {}
これらの例はファイルアップロードの入力ペイロードやレスポンスペイロードのいずれにも適用されます。
POST 操作でファイルを送信するための requestBody の例は次のようになります:
requestBody:
content:
application/octet-stream: {}
さらに、特定のメディアタイプを指定することがMAY あります:
# multiple, specific media types may be specified:
requestBody:
content:
# a binary file of type png or jpeg
image/jpeg: {}
image/png: {}
複数ファイルをアップロードするには、Example: Multipart Form with
Multiple Files に示されるように multipart メディアタイプを使用することがMUST
です。
単一の値に適用される単一のエンコーディング定義であり、Encoding Object と値のマッピングは、Media Type Object によって、Encoding Usage and Restrictions の説明に従って決定されます。
さまざまな型の値を文字列表現に変換する議論については、Appendix B を参照してください。
フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。
これらのフィールドは、下のセクションで定義される RFC6570 スタイルのシリアライゼーションフィールドの有無にかかわらず使用することがMAY できます。
| Field Name | Type | Description |
|---|---|---|
| contentType | string |
特定のプロパティをエンコードするための Content-Type。値はカンマ区切りのリストで、各要素は特定のメディアタイプ(例:
image/png)またはワイルドカードメディアタイプ(例:
image/*)のいずれかです。デフォルト値は以下の表に示す型に依存します。
|
| headers | Map[string, Header
Object | Reference Object] |
追加情報をヘッダとして提供するためのマップ。Content-Type は別途説明されており、このセクションではSHALL 無視されます。メディアタイプが multipart
でない場合、このフィールドはSHALL 無視されます。
|
| encoding | Map[string, Encoding Object] |
Media Type Object の encoding
フィールドと同様に、ネストされた Encoding Object を適用します。
|
| prefixEncoding | [Encoding Object] | Media Type Object の prefixEncoding
フィールドと同様に、ネストされた Encoding Object を適用します。 |
| itemEncoding | Encoding Object | Media Type Object の itemEncoding
フィールドと同様に、ネストされた Encoding Object を適用します。 |
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
contentType のデフォルト値は以下のとおりで、contentEncoding 列の n/a は
contentEncoding の存在や値が無関係であることを意味します。この表は、Encoding Usage and Restrictions に従って Encoding
Object が適用される値に基づいています。Encoding By Name の場合、配列内のプロパティ(type が
"array" の場合)は配列の各アイテムが対象であり、それ以外の型では全体の値が対象です。したがってこの表の array
行は、名前によるエンコード時にトップレベル配列内の配列値にのみ適用されます。
type |
contentEncoding |
Default contentType |
|---|---|---|
| absent | n/a | application/octet-stream |
string |
present | application/octet-stream |
string |
absent | text/plain |
number, integer, or boolean |
n/a | text/plain |
object |
n/a | application/json |
array |
n/a | application/json |
null の type 値の扱い方は、null
値がどのようにシリアライズされるかによります。null 値が完全に省略される場合、contentType
は無関係です。データ型変換のオプションについては Appendix B を参照してください。
| Field Name | Type | Description |
|---|---|---|
| style | string |
特定のプロパティ値がその型に応じてどのようにシリアライズされるかを記述します。詳細は Parameter
Object の style
フィールドを参照してください。挙動は query パラメータと同じ値に従い、contentType
が明示的に使用されない場合にのみ適用されるデフォルト値 "form" を含みます(これは explode または
allowReserved のいずれかが明示的に指定されている場合に該当します)。クエリ文字列で使用される初期の ?
は application/x-www-form-urlencoded のメッセージボディでは使用されないため、RFC6570
実装を使用する場合は削除すること、手動で構築する場合は単に追加しないことがMUST です。メディアタイプが
application/x-www-form-urlencoded または multipart/form-data
でない場合、このフィールドはSHALL 無視されます。値が明示的に定義されている場合、暗黙的あるいは明示的な contentType の値はSHALL 無視されます。
|
| explode | boolean |
これが true の場合、array または object
型のプロパティ値は、配列の各値やマップの各キーと値の組み合わせごとに個別のパラメータを生成します。他の型のプロパティや、style が "deepObject"
の場合、このフィールドは影響しません。style が "form" のときのデフォルト値は
true、それ以外のスタイルではデフォルトは false です。メディアタイプが
application/x-www-form-urlencoded または multipart/form-data
でない場合、このフィールドはSHALL 無視されます。値が明示的に定義されている場合、暗黙的あるいは明示的な contentType の値はSHALL 無視されます。
|
| allowReserved | boolean |
これが true の場合、パラメータ値は RFC6570 の定義による reserved expansion を使用してシリアライズされます。これにより RFC3986
の予約文字セットやパーセントエンコードされた三文字列がそのまま通過することが許される一方で、他の不許可文字(パーセントエンコードされた三文字列の外の
%
を含む)はパーセントエンコードされます。アプリケーションは、ターゲットメディアタイプで許可されない予約文字を自らパーセントエンコードする責任があります(詳細は URL Percent-Encoding を参照)。デフォルト値は
false です。メディアタイプが application/x-www-form-urlencoded または
multipart/form-data でない場合、このフィールドはSHALL
無視されます。値が明示的に定義されている場合、暗黙的あるいは明示的な contentType の値はSHALL 無視されます。
|
multipart/form-data に対して RFC6570 スタイルのシリアライゼーションを使用する場合、URI のパーセントエンコーディングはMUST NOT 適用され、allowReserved の値は無効です。追加のガイダンスについては Appendix C: Using RFC6570
Implementations を参照してください。
style、explode、または allowReserved
のいずれかが明示的な値で存在することは、in: "query" の Parameter Objects を schema
とともに使用するのと同等です。これら三つのフィールドがすべて欠けている場合は、content を使用するのと同等ですが、メディアタイプは Media Type
Object ではなく contentType で指定される点が異なります。
ネストされたフォーマット(特にネストされた multipart/mixed)がエンコーディングを必要とする場合、このオブジェクトの
encoding、prefixEncoding、および/または itemEncoding
フィールドでサポートできます。実装は一レベルのネストをサポートすることがMUST であり、追加レベルをサポートすることはMAY です。
Media Type Object で application/x-www-form-urlencoded
を使用して、WHATWG-URL のルールに従ってフォーム URL
エンコーディングするコンテンツを扱います。この設定では、複雑なオブジェクトが文字列にシリアライズされた後、該当するメディアタイプのための WHATWG-URL
の規則に従ってコンテンツをパーセントエンコードすることがMUST となります。
フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。
encoding フィールドがない場合、シリアライゼーション戦略は Encoding Object
のデフォルト値に基づきます:
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
id:
type: string
format: uuid
address:
type: object
properties: {}
この例では、id が f81d4fae-7dec-11d0-a765-00a0c91e6bf6 で、ZIP+4
を含む米国形式の住所が次のとおりだとします:
{
"streetAddress": "123 Example Dr.",
"city": "Somewhere",
"state": "CA",
"zip": "99999+1234"
}
JSON 値の最も緊密な表現(不要な空白を除いたもの)を仮定すると、リクエストボディは次のようになり、スペースは + に置き換えられ、+,
", :, ,, {, } はそれぞれ
%2B, %22, %3A, %2C, %7B,
%7D にパーセントエンコードされます:
id=f81d4fae-7dec-11d0-a765-00a0c91e6bf6&address=%7B%22streetAddress%22%3A%22123+Example+Dr.%22%2C%22city%22%3A%22Somewhere%22%2C%22state%22%3A%22CA%22%2C%22zip%22%3A%2299999%2B1234%22%7D
id キーワードは Encoding Object のデフォルト動作により text/plain
として扱われ、そのままシリアライズされる点に注意してください。もし application/json として扱われるなら、シリアライズされた値は引用符を含む JSON
文字列となり、それが %22 としてパーセントエンコードされます。
ここでは id パラメータ(address を除く)を text/plain ではなく
application/json としてシリアライズし、WHATWG-URL の form-urlencoded
規則に従ってエンコードした例を示します:
id=%22f81d4fae-7dec-11d0-a765-00a0c91e6bf6%22
application/x-www-form-urlencoded はテキスト形式であるため、バイナリデータは base64
エンコードする必要がある点に注意してください:
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
name:
type: string
icon:
# The default content type with `contentEncoding` present
# is `application/octet-stream`, so we need to set the correct
# image media type(s) in the Encoding Object.
type: string
contentEncoding: base64url
encoding:
icon:
contentType: image/png, image/jpeg
name が example、icon が 2x2 ピクセルの赤い PNG の場合、生成されるリクエストボディは次のようになります:
name=example&icon=iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAABGdBTUEAALGPC_xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAqADAAQAAAABAAAAAgAAAADO0J6QAAAAEElEQVQIHWP8zwACTGCSAQANHQEDqtPptQAAAABJRU5ErkJggg%3D%3D
「URL safe」である contentEncoding: base64url を使用していても、末尾の =
パディング文字はパーセントエンコードする必要がある点に注意してください。一部の base64 デコーダ実装はパディングなしで動作する可能性がありますが([RFC4648] の Section 3.2
を参照)、これは保証されないため、互換性を高めるにはパディングを保持してパーセントデコードに依存する方が良い場合があります。
スキーマプロパティとパートを関連付けるガイダンスについては、Encoding Usage and Restrictions を参照してください。
multipart メディアタイプ全般(および特に
multipart/form-data)で使用できるヘッダには重大な制約がある点に注意してください([RFC2046]
Section 5.1 および [RFC7578] Section 4.8
を参照)。
contentType に複数の値が提供される場合でも、パートの実際の Content-Type がドキュメントに含まれるため解析は簡単です。
エンコードおよびシリアライゼーションのために、実装はアプリケーションがどのメディアタイプを意図しているか示すための仕組みを提供することがMUST です。実装は代替としてメディアタイプのスニッフィング(SNIFF)を提供することがMAY ありますが、このプロセスにはセキュリティリスクがあるためデフォルト動作にしてはなりません(MUST NOT)。
multipart フィールドに対して contentEncoding を使用することは、Content-Transfer-Encoding
を含む headers フィールドを持ち、その値が contentEncoding で使用される値を要求するスキーマを持つ Encoding
Object を指定するのと同等です。もし contentEncoding が multipart フィールドに使用され、そのフィールドに対する Encoding
Object の headers に含まれる Content-Transfer-Encoding が
contentEncoding の値を許容しない場合、シリアライズおよび解析の結果は未定義になります。
Working with Binary Data で述べられているように、Encoding Object の
contentType(明示的またはデフォルトによる)が Schema Object の contentMediaType
と矛盾する場合、contentMediaType はSHALL 無視されます。このため、そして Encoding
Object の contentType のデフォルト規則が Schema Object の contentMediaType
を考慮に入れていないため、Encoding Object とともに contentMediaType を使用することはNOT
RECOMMENDED です。
また、Content-Transfer-Encoding は HTTP
でバイナリデータがサポートされているため、multipart/form-data に対しては非推奨である点に注意してください([RFC7578] Section
4.7)。
フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。
encoding フィールドが not 使用されている場合、エンコーディングは Encoding Object のデフォルトによって決定されます:
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
# default content type for a string without `contentEncoding`
# is `text/plain`
id:
type: string
format: uuid
# default content type for a schema without `type`
# is `application/octet-stream`
profileImage: {}
# for arrays, the `encoding` field applies the Encoding Object
# to each item individually and determines the default content type
# based on the type in the `items` subschema, which in this example
# is an object, so the default content type for each item is
# `application/json`
addresses:
type: array
items:
$ref: '#/components/schemas/Address'
encoding を使用すると、バイナリデータのより具体的な型や、複雑な値の非 JSON フォーマットを設定できます。また各パートのヘッダを記述することもできます:
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
# No Encoding Object, so use default `text/plain`
id:
type: string
format: uuid
# Encoding Object overrides the default `application/json` content type
# for each item in the array with `application/xml; charset=utf-8`
addresses:
description: addresses in XML format
type: array
items:
$ref: '#/components/schemas/Address'
# Encoding Object accepts only PNG or JPEG, and also describes
# a custom header for just this part in the multipart format
profileImage: {}
encoding:
addresses:
contentType: application/xml; charset=utf-8
profileImage:
contentType: image/png, image/jpeg
headers:
X-Rate-Limit-Limit:
description: The number of allowed requests in the current period
schema:
type: integer
[RFC7578] Section 4.3
に従い、単一のフォームフィールドに対する複数ファイルは各ファイルのパートで同じ名前(この例では file)を使用してアップロードされます:
requestBody:
content:
multipart/form-data:
schema:
properties:
# The property name `file` will be used for all files.
file:
type: array
items: {}
Encoding Object の contentType フィールド
の説明にあるように、items の空スキーマは application/octet-stream のメディアタイプを示します。
JSON メタデータ文書に続いて、そのメタデータが記述する画像が続く multipart/mixed ペイロードの例:
multipart/mixed:
schema:
type: array
prefixItems:
- type: object
properties:
author:
type: string
created:
type: string
format: datetime
copyright:
type: string
license:
type: string
- # default content type for a schema without `type`
# is `application/octet-stream`, which we need
# to override.
{}
prefixEncoding:
- # Encoding Object defaults are correct for JSON
{}
- contentType: image/*
[RFC2557]
に記載されているように、ウェブページを構成するリソース群は multipart/related ペイロードで送られ、text/html
ドキュメントからスクリプトやスタイルシート、画像などへのリンクを保持するために各ページに対して Content-Location
ヘッダを定義できます。最初のパートがルートリソースとして使用され(Content-ID を使用する場合を除くが RFC2557
はそれを推奨せず、本例では禁止しています)、したがって先頭要素に HTML リソースであることを要求するために prefixItems と
prefixEncoding を使用し、その後に任意の型のリソースが並べられることを許容します。
Content-Location ヘッダは URI 値のパーセントエンコードを避けるために
content: {text/plain: {...}} を使って定義しています;詳細は Appendix D を参照してください。
components:
headers:
RFC2557NoContentId:
description: Use Content-Location instead of Content-ID
schema: false
RFC2557ContentLocation:
required: true
content:
text/plain:
schema:
$comment: Use a full URI (not a relative reference)
type: string
format: uri
requestBodies:
RFC2557:
content:
multipart/related; type=text/html:
schema:
prefixItems:
- type: string
items:
anyOf:
- type: string
- $comment: To allow binary, this must always pass
prefixEncoding:
- contentType: text/html
headers:
Content-ID:
$ref: '#/components/headers/RFC2557NoContentId'
Content-Location:
$ref: '#/components/headers/RFC2557ContentLocation'
itemEncoding:
contentType: text/css,text/javascript,image/*
headers:
Content-ID:
$ref: '#/components/headers/RFC2557NoContentId'
Content-Location:
$ref: '#/components/headers/RFC2557ContentLocation'
この例は、大量の画像を撮影してそれらをストリームするデバイスを想定しています。前の例とは異なり、ここでは各画像が到着次第(または小さなバッチで)処理されることが期待されるため、すべてをバッファリングするのはメモリ的に不可能であることが分かっているため
itemSchema を使用します。
multipart/mixed:
itemSchema:
$comment: A single data image from the device
itemEncoding:
contentType: image/jpg
multipart/byteranges の場合、RFC9110 の Section 14.6
に従い、Content-Range ヘッダが必要です:
ヘッダ値を記述するために content: {text/plain: {...}} を使用する理由の説明は Appendix D を参照してください。
multipart/byteranges:
itemSchema:
$comment: A single range of bytes from a video
itemEncoding:
contentType: video/mp4
headers:
Content-Range:
required: true
content:
text/plain:
schema:
# The `pattern` regular expression that would
# be included in practice is omitted for simplicity
type: string
これは二部構成の multipart/mixed を定義しており、最初のパートは JSON 配列、二番目のパートはネストされた
multipart/mixed ドキュメントです。ネストされたパートは XML、プレーンテキスト、PNG 画像です。
multipart/mixed:
schema:
type: array
prefixItems:
- type: array
- type: array
prefixItems:
- type: object
- type: string
- {}
prefixEncoding:
- {} # Accept the default application/json
- contentType: multipart/mixed
prefixEncoding:
- contentType: application/xml
- {} # Accept the default text/plain
- contentType: image/png
ある操作の予想されるレスポンスのコンテナです。 このコンテナは HTTP レスポンスコードを期待されるレスポンスにマップします。
ドキュメントは、事前に知られていない可能性のあるすべての HTTP レスポンスコードを網羅することを必ずしも期待していません。 ただし、成功した操作のレスポンスと既知のエラーはドキュメント化されることが期待されます。
default MAY は、Responses Object に個別に含まれていないすべての HTTP コードに対するデフォルトの
Response Object として使用できます。
Responses Object は少なくとも1つのレスポンスコードを含まなければならず(MUST)、もし 1 つのみのレスポンスコードが提供される場合、それは成功した操作呼び出しのレスポンスであることがSHOULD です。
| Field Name | Type | Description |
|---|---|---|
| default | Response Object | Reference Object | 特定の HTTP レスポンスコードとして宣言されているもの以外のレスポンスのドキュメントです。宣言されていないレスポンスをカバーするためにこのフィールドを使用します。 |
| Field Pattern | Type | Description |
|---|---|---|
| HTTP Status Code | Response Object | Reference Object | 任意の HTTP ステータスコード をプロパティ名として使用できますが、各コードにつきプロパティは 1
つだけで、その HTTP ステータスコードに対する期待されるレスポンスを記述します。JSON と YAML の互換性のため、このフィールドは引用符で囲むことがMUSTです(例: “200”)。レスポンスコードの範囲を定義するために、大文字のワイルドカード文字
X をこのフィールドに含めることがMAY あります。例として 2XX は
200 から 299 までのすべてのレスポンスコードを表します。許可される範囲定義は次のみです:
1XX, 2XX, 3XX, 4XX,
5XX。もし明示的なコードでレスポンスが定義されている場合、その明示的コードの定義が範囲定義より優先されます。
|
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
HTTP ステータスコードは実行された操作の状態を示すために使用されます。 ステータスコードは IANA Status Code Registry に登録されている利用可能なステータスコードから選択することがSHOULD 推奨されます。
成功した操作の 200 レスポンスと、その他(エラーを示唆)のための default レスポンスの例:
'200':
description: a pet to be returned
content:
application/json:
schema:
$ref: '#/components/schemas/Pet'
default:
description: Unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorModel'
API 操作からの単一レスポンスを記述します。レスポンスに基づいて設計時に静的な links を含めることができます。
| Field Name | Type | Description |
|---|---|---|
| summary | string |
レスポンスの意味の短い要約です。 |
| description | string |
レスポンスの説明です。[CommonMark] 構文を使用してリッチテキスト表現を行うことがMAY できます。 |
| headers | Map[string, Header
Object | Reference Object] |
ヘッダ名をその定義にマッピングします。[RFC9110] の Section 5.1
はヘッダ名が大文字小文字を区別しないことを示しています。もしレスポンスヘッダが "Content-Type"
という名前で定義されている場合、それはSHALL 無視されます。
|
| content | Map[string, Media
Type Object | Reference Object] |
潜在的なレスポンスペイロードの説明を含むマップです。キーはメディアタイプまたは media type range
で、値がそれを記述します。複数のキーにマッチするレスポンスがある場合、最も具体的なキーのみが適用されます。例: "text/plain" は
"text/*" を上書きします。
|
| links | Map[string, Link
Object | Reference Object] |
レスポンスから続けられる操作リンクのマップです。マップのキーは短い名前で、Component Objects の名前の命名制約に従います。 |
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
複雑型の配列を返すレスポンスの例:
description: A complex object array response
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/VeryComplexType'
文字列型のレスポンスの例:
description: A simple string response
content:
text/plain:
schema:
type: string
ヘッダを含むプレーンテキストレスポンスの例:
description: A simple string response
content:
text/plain:
schema:
type: string
example: 'whoa!'
headers:
X-Rate-Limit-Limit:
description: The number of allowed requests in the current period
schema:
type: integer
X-Rate-Limit-Remaining:
description: The number of remaining requests in the current period
schema:
type: integer
X-Rate-Limit-Reset:
description: The number of seconds left in the current period
schema:
type: integer
戻り値のないレスポンスの例:
description: object created
親操作に関連する可能性のあるアウトオブバンドのコールバックのマップです。 マップ内の各値は Path Item Object で、API プロバイダが開始する可能性のある一連のリクエストと期待されるレスポンスを記述します。 Path Item Object を識別するために使用されるキー値は、実行時に評価される式であり、コールバック操作に使用する URL を特定します。
API プロバイダからの受信リクエストを別の API 呼び出しから独立して記述するには、webhooks
フィールドを使用してください。
| Field Pattern | Type | Description |
|---|---|---|
| {expression} | Path Item Object | コールバックリクエストと期待されるレスポンスを定義するために使用される Path Item Object です。完全な例 が利用可能です。 |
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
Path Item Object を識別するキーは、ランタイムの HTTP リクエスト/レスポンスのコンテキストで評価され、コールバックリクエストに使用する URL を特定できる runtime expression です。
単純な例としては $request.body#/url などが挙げられます。
ただし、runtime expression を使用すると完全な HTTP メッセージにアクセスできます。
これには JSON Pointer [RFC6901]
が参照できるボディの任意の部分へのアクセスも含まれます。
例えば、次の HTTP リクエストが与えられたとします:
POST /subscribe/myevent?queryUrl=https://clientdomain.com/stillrunning HTTP/1.1
Host: example.org
Content-Type: application/json
Content-Length: 188
{
"failedUrl": "https://clientdomain.com/failed",
"successUrls": [
"https://clientdomain.com/fast",
"https://clientdomain.com/medium",
"https://clientdomain.com/slow"
]
}
結果として次が返されます:
201 Created
Location: https://example.org/subscription/1
以下の例は、コールバック操作がパスパラメータ eventType とクエリパラメータ queryUrl
を持つことを前提に、さまざまな式がどのように評価されるかを示します。
| Expression | Value |
|---|---|
| $url | https://example.org/subscribe/myevent?queryUrl=https://clientdomain.com/stillrunning |
| $method | POST |
| $request.path.eventType | myevent |
| $request.query.queryUrl | https://clientdomain.com/stillrunning |
| $request.header.content-type | application/json |
| $request.body#/failedUrl | https://clientdomain.com/failed |
| $request.body#/successUrls/1 | https://clientdomain.com/medium |
| $response.header.Location | https://example.org/subscription/1 |
次の例は、ユーザ提供のクエリ文字列パラメータ queryUrl をコールバック URL の定義に使用するものです。これは webhook に似ていますが、初回リクエストで queryUrl
を送信したことによりのみコールバックが発生する点が異なります。
myCallback:
'{$request.query.queryUrl}':
post:
requestBody:
description: Callback payload
content:
application/json:
schema:
$ref: '#/components/schemas/SomePayload'
responses:
'200':
description: callback successfully processed
次の例は、サーバがハードコードされているが、クエリ文字列パラメータがリクエストボディの id と email
のプロパティから埋められるコールバックの例を示します。
transactionCallback:
'http://notificationServer.com?transactionId={$request.body#/id}&email={$request.body#/email}':
post:
requestBody:
description: Callback payload
content:
application/json:
schema:
$ref: '#/components/schemas/SomePayload'
responses:
'200':
description: callback successfully processed
内部または外部の例値を基本的な summary と description メタデータとまとめるオブジェクトです。
例は、スキーマ検証に適したデータ、または包含する Media Type Object、Parameter Object、あるいは Header Object
に要求されるシリアライズ済みデータのいずれかを示すことができます。
このオブジェクトは通常 examples(複数)という名前のフィールドで使用され、参照可能な代替手段として古い単体の example
フィールドより優れています。
さまざまなフィールドと例の種類については Working With Examples で詳述されています。
| Field Name | Type | Description |
|---|---|---|
| summary | string |
例の短い説明です。 |
| description | string |
例の長い説明です。[CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。 |
| dataValue | Any | 関連する Schema Object に従って有効でなければならない(MUST)データ構造の例です。このフィールドが存在する場合、value は存在してはなりません。
|
| serializedValue | string |
エンコードやエスケープを含む、値のシリアライズ形の例です(Validating Examples
参照)。もし dataValue が存在する場合、このフィールドはそのデータのシリアライズを含むことがSHOULD です。そうでなければ、このフィールドは dataValue
として有効でなければならないデータ値の有効なシリアライズであることがSHOULD です。シリアライズ形式が JSON
の場合、このフィールドは通常使用すべきではありません。もしこのフィールドが存在する場合、value と
externalValue は存在してはなりません。
|
| externalValue | string |
別ドキュメント内のシリアライズ済み例を指し示す URI です。Unicode 文字列として簡単に表現できない値を扱うために使用します。もし
dataValue が存在する場合、このフィールドはそのデータのシリアライズを指し示すことがSHOULD です。そうでない場合、この値は dataValue
として有効でなければならないデータ値の有効なシリアライズであることがSHOULD
です。もしこのフィールドが存在する場合、serializedValue と value
は存在してはなりません。相対参照の解決規則については Relative References
を参照してください。
|
| value | Any | 埋め込みリテラル例です。value フィールドと externalValue フィールドは相互排他的です。JSON や
YAML で自然に表現できないメディアタイプの例を表現するには、必要に応じてエスケープを行った文字列として例を格納してください。非 JSON シリアル化ターゲットに対する非推奨:明確な構文と意味を持つ dataValue および/または
serializedValue を使用してください。
|
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
あらゆる場合において、例の値は関連するスキーマと互換であることがSHOULD です。 ツール実装は互換性を自動的に検証し、互換性がない場合に例の値を拒否することがMAY あります。 互換性の正確な意味については Validating Examples を参照してください。
Example Object は Parameter Objects、Header
Objects、および Media Type Objects で使用できます。これら三つのオブジェクトでは、いずれも
examples(複数)フィールドを通じて行われます。
しかし、例を提供する他の方法もいくつかあります: 単体の example(複数の examples と相互排他的)と、Schema Object 内のキーワード(古い単体の example と現在の複数の
examples 配列)などです。
ここでは、Parameter/Header/Media Type オブジェクト内の単体 example(これは単に value
フィールドのみを持つ単一の Example Object と同じ振る舞い)を「略式の example」と呼びます。
それぞれのフィールドにはわずかに異なる考慮点があります。
value および略式の example フィールドは、最終的なシリアライズ形と JSON(または JSON 互換
YAML)表現の間に差がない場合に、serializedValue(または externalValue) と同じ 意味
を持ちながらより便利な 構文 を許す意図で設計されています。application/json や任意の +json
メディアタイプに対してこの構文を使用する場合、これらのフィールドは事実上 dataValue と同等に振る舞うため、安全に使用できます。
単一文字列から成るデータで、text/plain のように文字列が追加のエスケープを必要としないシリアライズターゲットの場合、これらのフィールドも安全に使用できます。
その他のシリアライズターゲットについては「JSON や YAML で自然に表現できる」という曖昧さや過去の例テーブルの誤りが、一貫性のないサポートと使用を招いています。実務上、非 JSON
ターゲットに対しては value と略式 example の振る舞いが実装依存になりがちであるため、互換性を確保したい OAD
作成者は他のフィールドの使用を推奨します。
前節の注意点を念頭に置き、略式 example は Example Object が 1 つだけの場合に value
の代わりに使用できることを踏まえ、どのフィールドを使うかのガイドラインは次のとおりです。
Schema Object によって検証されるように例を示すには:
examples 配列(JSON Schema draft 2020-12)を使用します。
example を使用します。dataValue を使用します。
value を使用します。
HTTP/1.1 メッセージを構築するためにどのようにシリアライズされるかを示すには:
serializedValue を使用します。
value の文字列形式は、OAS v3.1 以前との互換性が必要な場合にのみ使用してください。externalValue
を使用します。serializedValue と externalValue はどちらもシリアライズ形を示さなければならず(MUST)、Media Type Objects では適切なメディアタイプの文書であり、Encoding Object
の効果が適用されたものである必要があります。Parameter と Header オブジェクトで schema と style
を使う場合は、何がシリアライズされた値に相当するかは Style Examples を参照してください。
次のいずれかが当てはまる場合、そのシリアライズは serializedValue に有効な Unicode 文字列として表現できます:
charset をサポートし任意の Unicode エンコーディング(UTF-8, UTF-16 等)を示せるメディアタイプである場合。
multipart/mixed で一部が
application/json、他部が application/xml; charset=utf-8 の場合)である場合。
これらの場合、OAD の文字セット(JSON の相互運用文字セットとして UTF-8 を想定)から Unicode コードポイントへの変換およびその後のシリアライズ文字セットへの変換は定義されています。
externalValue の場合、文字セットが明示されておらずフォーマットやメディアタイプ規格でも決定できないときは、実装は UTF-8 を想定することがSHOULD です。
ツール実装は互換性を自動的に検証し、互換性がない場合に例の値を拒否することがMAY あります。スキーマ準備済みのデータ形式の例では、これは簡単です。
シリアライズ済みの例では、いくつかのフォーマットが同じデータに対して複数の有効な表現を許す場合があり、付録 B に示すシナリオが含まれます。シリアライズ済みの例を解析して得られたデータを検証することで曖昧さを解消できる場合もありますが、解析自体が曖昧になる場合もあり得ます。したがって、シリアライズ済み例の検証は最善努力の機能であることに注意してください。
YAML で記述する際、dataValue に対して JSON 構文を使用でき(noRating 例で示すように)必須ではありません。
この例は JSON に関する dataValue と serializedValue
の振る舞いを示しますが、ほとんどの場合はデータ形式のみで十分です。
content:
application/json:
schema:
type: object
required:
- author
- title
properties:
author:
type: string
title:
type: string
rating:
type: number
minimum: 1
maximum: 5
multipleOf: 0.5
examples:
noRating:
summary: A not-yet-rated work
dataValue:
author: A. Writer
title: The Newest Book
withRating:
summary: A work with an average rating of 4.5 stars
dataValue:
author: A. Writer
title: An Older Book
rating: 4.5
serializedValue: |
{
"author": "A. Writer",
"title": "An Older Book",
"rating": 4.5
}
完全なバイナリデータは externalValue を使って示します:
content:
image/png:
schema: {}
examples:
Red:
externalValue: ./examples/2-by-2-red-pixels.png
真偽値のシリアライズ方法に標準が存在しないため(付録 B
参照)、この例では特定のパラメータに対する真偽値のシリアライズを示すために dataValue と serializedValue
を使用しています:
name: flag
in: query
required: true
schema:
type: boolean
examples:
"true":
dataValue: true
serializedValue: flag=true
"false":
dataValue: false
serializedValue: flag=false
Link Object はレスポンスに対する設計時の可能なリンクを表します。 リンクの存在は呼び出し元がそれを確実に正常に呼び出せることを保証するものではなく、むしろレスポンスと他の操作との既知の関係および横断の仕組みを提供します。
dynamic リンク(つまりレスポンスペイロード内に含まれるリンク)とは異なり、OAS のリンク機構はランタイムレスポンス内にリンク情報を必要としません。
リンクを計算してそれを実行するための指示を与えるには、runtime expression を使って操作内の値にアクセスし、それらをリンク先操作を呼び出す際のパラメータとして使用します。
| Field Name | Type | Description |
|---|---|---|
| operationRef | string |
OAS の操作への URI 参照です。このフィールドは operationId フィールドと相互排他的であり、MUST Operation Object
を指す必要があります。相対的な operationRef 値は OpenAPI 記述内の既存の Operation Object を特定するためにMAY
使用できます。 |
| operationId | string |
一意の operationId で定義された、既存の 解決可能な OAS 操作の名前です。このフィールドは
operationRef フィールドと相互排他的です。
|
| parameters | Map[string, Any | {expression}] |
operationId で指定された、または operationRef
によって識別された操作に渡すパラメータを表すマップです。キーは使用されるパラメータ名(オプションでパラメータの位置で修飾可能、例:パス内の id
パラメータの場合は path.id)で、値は定数か評価されてリンク先操作に渡される式になり得ます。 |
| requestBody | Any | {expression} | ターゲット操作を呼び出す際に使用するリクエストボディとしてのリテラル値または {expression} です。 |
| description | string |
リンクの説明です。[CommonMark] 構文を使ってリッチテキスト表現を行うことがMAY できます。 |
| server | Server Object | ターゲット操作で使用されるサーバオブジェクトです。 |
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
リンクされた操作は operationRef または operationId のいずれかで識別されることがMUST です。
識別または参照された操作は一意でなければならず、operationId の場合、その解決は OpenAPI 記述(OAD)のスコープ内で行われることがMUST です。名前の衝突の可能性のため、マルチドキュメント OAD では operationRef 構文が推奨されます。
ただし、操作の使用は Paths Object におけるその URL パステンプレートに依存するため、OAD 内で複数回参照される任意の Path Item Object
からの操作は一意に解決できない場合があります。そのような曖昧なケースでは、結果の振る舞いは実装定義となり、エラーになることがMAY あります。
parameters にランタイム式の構文と一致する定数値を与えることはできない点に注意してください。
例えば name: "id", in: "path" と name: "path.id", in: "query"
のようにあいまいなパラメータ名があり得ますが、これはNOT RECOMMENDED
であり振る舞いは実装定義です。ただし実装は修飾された解釈(path.id をパスパラメータと解釈)を優先すべきであり(例:クエリパラメータの場合は
query.path.id のように明示して曖昧さを解消できます)、これが望まれます。
リクエスト操作からリンクを計算する例で、$request.path.id を使用してリンク先操作にリクエストパラメータを渡しています。
paths:
/users/{id}:
parameters:
- name: id
in: path
required: true
description: the user identifier, as userId
schema:
type: string
get:
responses:
'200':
description: the user being returned
content:
application/json:
schema:
type: object
properties:
uuid: # the unique user id
type: string
format: uuid
links:
address:
# the target link operationId
operationId: getUserAddress
parameters:
# get the `id` field from the request path parameter named "id"
userid: $request.path.id
# the path item of the linked operation
/users/{userid}/address:
parameters:
- name: userid
in: path
required: true
description: the user identifier, as userId
schema:
type: string
# linked operation
get:
operationId: getUserAddress
responses:
'200':
description: the user's address
ランタイム式の評価に失敗した場合、ターゲット操作にはパラメータ値は渡されません。
レスポンスボディからの値を使ってリンク先操作を駆動することができます。
links:
address:
operationId: getUserAddressByUUID
parameters:
# get the `uuid` field from the `uuid` field in the response body
userUuid: $response.body#/uuid
クライアントは任意でリンクをたどることができます。 関係の存在そのものだけでは、そのリンクへのアクセス権限や正常な呼び出しの能力は保証されません。
operationId は Operation Object で任意のフィールドであるため、代わりに
URI 参照によって operationRef で参照されることがMAY あります。
これらの例はいずれも、操作のパステンプレートが曖昧にならないように Paths Object
を通じて識別できる操作を参照している点に注意してください。
相対 URI 参照の operationRef:
links:
UserRepositories:
# returns array of '#/components/schemas/repository'
operationRef: '#/paths/~12.0~1repositories~1%7Busername%7D/get'
parameters:
username: $response.body#/username
非相対 URI の operationRef:
links:
UserRepositories:
# returns array of '#/components/schemas/repository'
operationRef: https://na2.gigantic-server.com/#/paths/~12.0~1repositories~1%7Busername%7D/get
parameters:
username: $response.body#/username
operationRef を使う場合、URI フラグメント内で JSON Pointer を使う際に「エスケープされたスラッシュ」(~1)
が必要であり、波かっこ { と } はそれぞれ %7B と %7D として URL
エンコードする必要がある点に注意してください。上の例での非エスケープ済みかつパーセントデコードされたパステンプレートは
/2.0/repositories/{username} になります。
Runtime expression は、実際の API 呼び出しの HTTP メッセージ内でのみ利用可能になる情報に基づいて値を定義することを可能にします。 この仕組みは Link Objects や Callback Objects で使用されます。
ランタイム式は次の [ABNF] 構文によって定義されます。
expression = "$url" / "$method" / "$statusCode" / "$request." source / "$response." source
source = header-reference / query-reference / path-reference / body-reference
header-reference = "header." token
query-reference = "query." name
path-reference = "path." name
body-reference = "body" ["#" json-pointer ]
json-pointer = *( "/" reference-token )
reference-token = *( unescaped / escaped )
unescaped = %x00-2E / %x30-7D / %x7F-10FFFF
; %x2F ('/') and %x7E ('~') are excluded from 'unescaped'
escaped = "~" ( "0" / "1" )
; representing '~' and '/', respectively
name = *char
token = 1*tchar
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / " / "+" / "-" / "."
/ "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
ここで、json-pointer は [RFC6901] に由来し、char
は [RFC8259]
の該当箇所、token は [RFC9110] の該当箇所から取られています。
name 識別子は大文字小文字を区別しますが、token は区別しません。
下表はランタイム式の例と値での使用例を示します:
| Source Location | example expression | notes |
|---|---|---|
| HTTP Method | $method |
$method の許容値は HTTP 操作に対応するものになります。 |
| Requested media type | $request.header.accept |
|
| Request parameter | $request.path.id |
リクエストパラメータは親操作の parameters
セクションで宣言されていなければ評価できないことに注意してください。これにはリクエストヘッダも含まれます。 |
| Request body property | $request.body#/user/uuid |
ペイロードを受け付ける操作では、requestBody の一部や全体を参照できます。 |
| Request URL | $url |
|
| Response value | $response.body#/status |
ペイロードを返す操作では、レスポンスボディの一部や全体を参照できます。 |
| Response header | $response.header.Server |
単一のヘッダ値のみが利用可能です。 |
ランタイム式は参照される値の型を保持します。
式は文字列内に埋め込むことができ、その場合は式を波かっこ {} で囲みます。
HTTP レスポンスのための単一のヘッダや、multipart 表現の個々のパートのためのヘッダを記述します(どのヘッダを記述できるかの制約については該当する Response Object および Encoding Object
のドキュメントを参照してください)。
Header Object は Parameter Object の構造に従い、schema または
content が存在するかに基づいてシリアライゼーション戦略を決定しますが、以下の変更点があります:
name は指定してはMUST NOT であり、対応する headers マップ内で与えられます。
in は指定してはMUST NOT であり、暗黙的に header です。style)、これにより
allowEmptyValue はMUST NOT 使用できず、もし style を使う場合は
"simple" に限定されることになります。
これらのフィールドは content あるいは schema のいずれと共に使用することがMAY できます。
example と examples のフィールドは相互排他的です;検証要件に関するガイダンスは Working with Examples を参照してください。
| Field Name | Type | Description |
|---|---|---|
| description | string |
ヘッダの簡潔な説明です。使用例を含めることがあります。[CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。 |
| required | boolean |
このヘッダが必須かどうかを決定します。デフォルト値は false です。 |
| deprecated | boolean |
ヘッダが非推奨であることを示し、使用を段階的に中止することがSHOULD 推奨されます。デフォルト値は
false です。
|
| example | Any | ヘッダの潜在的な値の例;詳細は Working With Examples を参照してください。 |
| examples | Map[ string, Example Object | Reference Object] |
ヘッダの潜在的な値の例;詳細は Working With Examples を参照してください。 |
このオブジェクトは Specification Extensions によって拡張されることがMAY あります。
より単純なシナリオでは、schema と style によってヘッダの構造と構文を記述できます。
schema を使ってヘッダをシリアライズする場合、URI パーセントエンコーディングはMUST NOT
適用されます;自動的に適用する RFC6570 実装を使用する場合は、その適用を取り消す必要があります。実装はヘッダの引用を試みるのではなく値をそのまま通過させることがMUST です。引用やエスケープのガイダンスは Appendix D を参照してください。
| Field Name | Type | Description |
|---|---|---|
| style | string |
ヘッダ値がどのようにシリアライズされるかを記述します。既定値(かつヘッダに対して唯一許される値)は "simple" です。 |
| explode | boolean |
これが true の場合、array または object
型のヘッダ値は、配列要素またはマップのキー-値ペアをカンマ区切りで単一のヘッダ値として生成します。その他のデータ型ではこのフィールドは無効です。デフォルトは
false です。
|
| schema | Schema Object | ヘッダに使用される型を定義するスキーマです。 |
追加のガイダンスは Appendix C: Using RFC6570-Based Serialization を参照してください。
より複雑なシナリオでは、content
フィールドがヘッダのメディアタイプとスキーマを定義し、その使用例を示すことができます。
| Field Name | Type | Description |
|---|---|---|
| content | Map[string, Media Type Object | Reference Object] |
ヘッダの表現を含むマップ。キーはメディアタイプで、値がそれを記述します。マップはMUST 1エントリのみを含む必要があります。 |
[RFC9264]
は application/linkset と application/linkset+json のメディアタイプを定義しています。
前者は HTTP Link ヘッダ値のフォーマットとほぼ同じですが可読性のために追加の空白を許容し、後者はそのヘッダの同等の JSON 表現です。
これらのメディアタイプのいずれかを使う場合、Media Type Object の schema は
application/linkset+json フォーマットで構造化されるリンクを記述しなければなりません(MUST)。Media Type Object の親キーが application/linkset+json
であればシリアライズは自明ですが、この形式は HTTP の Link ヘッダでは使用できません。親キーが application/linkset
の場合、シリアライズは schema にモデル化されたリンクの等価表現でなければなりません。Header Object(または
in: "header" の Parameter Object) の content フィールドで
application/linkset を使う場合、シリアライズは HTTP フィールド構文と互換になるように行われることがMUST です([RFC9264]
の該当節参照)。
次の例は、同じデータモデルがコレクションのページネーション用 linkset をメッセージ本文の JSON 形式として、あるいは HTTP の Link
ヘッダとして使われる場合の方法を示します:
components:
schemas:
SimpleLinkContext:
type: array
items:
type: object
required:
- href
properties:
href:
type: string
format: uri-reference
CollectionLinks:
type: object
required:
- linkset
properties:
linkset:
type: array
items:
type: object
required: [first, prev, next, last]
properties:
anchor:
type: string
format: uri
additionalProperties:
$ref: '#/components/schemas/SimpleLinkContext'
responses:
CollectionWithLinks:
content:
application/json:
schema:
type: array
headers:
Link:
required: true
content:
application/linkset:
schema:
$ref: '#/components/schemas/CollectionLinks'
StandaloneJsonLinkset:
content:
application/linkset+json:
schema:
$ref: '#/components/mediaTypes/CollectionLinks'
型が integer の単純なヘッダの例:
X-Rate-Limit-Limit:
description: The number of allowed requests in the current period
schema:
type: integer
強い ETag ヘッダ(値が W/ ではなく先頭が " で始まるもの)が存在することを要求する例:
ETag:
required: true
schema:
type: string
# Note that quotation marks are part of the
# ETag value, unlike many other headers that
# use a quoted string purely for managing
# reserved characters.
pattern: ^"
example: '"xyzzy"'
これは Operation Object で使用される単一のタグにメタデータを追加します。 Operation Object のインスタンスで定義された各タグごとに Tag Object を必ずしも持つ必要はありません。
| フィールド名 | 型 | 説明 |
|---|---|---|
| name | string |
REQUIRED。タグの名前です。Operation の tags
配列でこの値を使用します。 |
| summary | string |
表示目的で使用されるタグの短い要約です。 |
| description | string |
タグの説明です。[CommonMark] 構文はリッチテキスト表現に MAY 使用できます。 |
| externalDocs | External Documentation Object | このタグの追加の外部ドキュメントです。 |
| parent | string |
このタグがネストされているタグの name。名前で指定されたタグは API 記述内に存在しなければなりません(MUST)。親子タグ間の循環参照は使用してはなりません(MUST NOT)。
|
| kind | string |
タグの種類を分類する機械可読の文字列です。任意の文字列値を使用できます。一般的な用途としてはナビゲーション用の nav、表示用バッジの
badge、異なるグループが利用する API を示す audience などがあります。よく使われる値の登録は こちら を参照してください。
|
このオブジェクトは MAY Specification Extensions によって拡張できます。
tags:
- name: account-updates
summary: Account Updates
description: Account update operations
kind: nav
- name: partner
summary: Partner
description: Operations available to the partners network
parent: external
kind: audience
- name: external
summary: External
description: Operations available to external consumers
kind: audience
OpenAPI 記述内の他のコンポーネントを内部および外部から参照するための単純なオブジェクトです。
$ref の文字列値は URI を含み([RFC3986])、参照される値を識別します。
相対参照の解決 のルールを参照してください。
| フィールド名 | 型 | 説明 |
|---|---|---|
| $ref | string |
REQUIRED。参照識別子です。これは URI の形式である必要があります(MUST)。 |
| summary | string |
デフォルトで参照先コンポーネントの SHOULD 上書きする短い要約です。参照先のオブジェクト種別が
summary フィールドを許可しない場合、このフィールドは効果がありません。
|
| description | string |
デフォルトで参照先コンポーネントの説明を SHOULD 上書きする説明です。[CommonMark] 構文はリッチテキスト表現に MAY 使用できます。参照先のオブジェクト種別が description
フィールドを許可しない場合、このフィールドは効果がありません。 |
このオブジェクトは追加プロパティで拡張することはできず、追加されたプロパティは SHALL 無視されます。
この追加プロパティに関する制限は、Schema Objects($ref
キーワードを含むもの)との違いであることに注意してください。
$ref: '#/components/schemas/Pet'
$ref: Pet.yaml
$ref: definitions.yaml#/Pet
Schema Object は入出力データ型の定義を可能にします。
これらの型はオブジェクトだけでなくプリミティブや配列でもあり得ます。このオブジェクトは JSON Schema Specification
Draft 2020-12 のスーパーセットです。空のスキーマ(任意のインスタンスを検証可能にするもの)はブール値 true で表現しても MAY よく、どのインスタンスも検証しないスキーマはブール値 false で表現しても MAY よいとされます。
キーワードの詳細については JSON Schema Core および JSON Schema Validation を参照してください。
特に明記されていない限り、キーワードの定義は JSON Schema に従い追加の意味論を付与しません。これには $schema, $id,
$ref, および $dynamicRef が URL ではなく URI であることが含まれます。
JSON Schema が振る舞いをアプリケーションに委ねている場合(例:注釈について)でも、OAS は OpenAPI ドキュメントを消費するアプリケーションに意味の定義を委ねます。
OpenAPI の Schema Object の dialect は OAS 基本語彙(OAS base vocabulary)を要求するよう定義されており、さらに JSON Schema Specification Draft 2020-12 に指定された語彙を含みます(general purpose meta-schema を参照)。
このバージョンの仕様での OpenAPI Schema Object ダイアレクトは URI
https://spec.openapis.org/oas/3.1/dialect/base によって識別されます(「OAS dialect schema id」)。
次のキーワードは JSON Schema から取られていますが、その定義は OAS によって拡張されています:
OAS ダイアレクトを構成する JSON Schema キーワードに加えて、Schema Object は他の語彙からのキーワードや任意のプロパティをサポートします。
JSON Schema 実装は OpenAPI Specification の基本語彙で定義されたキーワードを 未知のキーワード
として扱うことが MAY あります。これは OAS ダイアレクトに含まれており $vocabulary
の値が false であるためです。
OAS 基本語彙は次のキーワードで構成されます:
| フィールド名 | 型 | 説明 |
|---|---|---|
| discriminator | Discriminator Object | discriminator は、ペイロードが満たすことが期待される複数のスキーマのうちどれであるかの「ヒント」を提供します。詳細は Composition and Inheritance を参照してください。 |
| xml | XML Object | このスキーマの XML 表現を記述するための追加メタデータを付加します。 |
| externalDocs | External Documentation Object | このスキーマの追加の外部ドキュメントです。 |
| example | Any | このスキーマのインスタンス例を含めるための自由形式フィールドです。JSON や YAML
で自然に表現できない例を表すには、必要に応じてエスケープした文字列値を使用できます。 Deprecated: example フィールドは JSON Schema の examples
キーワードに置き換えられています。example の使用は推奨されず、将来の仕様で削除される可能性があります。
|
このオブジェクトは MAY Specification
Extensions によって拡張できます。なお、このオブジェクト内では追加プロパティが MAY x-
プレフィックスを省略できる点に注意してください。
OAS のデータ型は JSON Schema Validation Specification Draft 2020-12 で定義された型に基づいています: “null”, “boolean”, “object”, “array”, “number”, “string”, または “integer”。 モデルは Schema Object を使って定義され、これは JSON Schema Specification Draft 2020-12 のスーパーセットです。
JSON Schema のキーワードや format の値は、6つの JSON データ型(“null”, “boolean”, “object”, “array”,
“number”, “string”)のいずれかである可能性のある JSON インスタンスに対して作用し、特定のキーワードやフォーマットは特定の型にのみ適用されます。たとえば
pattern キーワードや date-time フォーマットは文字列にのみ適用され、他の5つの型のインスタンスは自動的に有効と扱われます。つまり
JSON Schema のキーワードやフォーマットは期待される型を暗黙に要求するものではありません。型を明示的に制約するには type キーワードを使用してください。
type キーワードは便宜上 "integer" を値として許容しますが、キーワードやフォーマットの適用性は整数を他の数値と区別する独立した JSON
型として認識しません。これは JSON 自体がその区別を行わないためです。JSON Schema は整数を数学的に定義します。つまり 1 と 1.0
は等価であり、どちらも整数と見なされます。
JSON
Schema Validation specification に定義されるように、データ型はオプションの修飾キーワード format
を持つことができます。仕様に記載されているとおり、format はデフォルトで非検証注釈として扱われ、format
を検証する能力は実装により異なります。
OpenAPI Initiative は OAS ユーザーや他仕様によって定義されたフォーマットのための Format Registry を運営しています。登録済みフォーマットへの対応は厳密に OPTIONAL であり、ある登録フォーマットへの対応は他のフォーマットへの対応を意味しません。
format キーワードを伴わない型は JSON Schema の型定義に従います。特定の format を認識しないツールは MAY 型のみを使ってデフォルト処理を行い、format が指定されていないかのように扱うことがあります。
JSON Schema の検証の目的では、各フォーマットはそれが適用される JSON データ型の集合を指定すべきです。このレジストリではこれらの型が「JSON Data
Type」列に示されています。
OAS によって定義されたフォーマットは次のとおりです:
format |
JSON データ型 | コメント |
|---|---|---|
int32 |
number | 符号付き 32 ビット |
int64 |
number | 符号付き 64 ビット(いわゆる long) |
float |
number | |
double |
number | |
password |
string | 値を隠すためのヒントです。 |
Data Type の節で述べたとおり、type: number と
type: integer の両方がデータモデル上は数値と見なされます。
API データにはいくつかの形式があります:
format や contentType
のようなキーワードが伝える追加情報、およびクラス階層など仕様の範囲外の追加情報を組み込んだ「アプリケーション形式」。これらは Discriminator Object や Data Modeling Techniques に基づく場合があります。JSON シリアライズされたデータは、JSON 表現とほぼ同等であり、JSON
Schema データモデル は JSON 表現とほぼ等しいためです。
シリアライズされた UTF-8 の JSON 文字列 {"when": "1985-04-12T23:20:50.52"} は、名前が
when で値が文字列 1985-04-12T23:20:50.52 のフィールドを持つオブジェクトを表します。
正確なアプリケーション形式はこの仕様の範囲外ですが、次のスキーマで示すことができます:
type: object
properties:
when:
type: string
format: date-time
いくつかのアプリケーションは文字列をそのまま文字列として扱うかもしれませんが、他のアプリケーションは format を見て Python の
datetime.datetime インスタンスや Java の java.time.ZonedDateTime に変換するかもしれません。
この仕様はデータがスキーマに従って有効であることと、annotations(例:format)が JSON
Schema 仕様に従って利用可能であることのみを要求します。
非 JSON のシリアライズは対応するデータ形式と大きく異なることがあり、解析に複数のステップを要する場合があります。
“when” の例を続けると、オブジェクトを application/x-www-form-urlencoded としてシリアライズすると ASCII 文字列
when=1985-04-12T23%3A20%3A50.52 のようになります。
これはすべて文字列データであるため扱いやすく、JSON との違いは URI のパーセントエンコーディングと区切り構文(JSON の句読点や引用の代わりに =
を使う点)だけです。
しかし、多くの非 JSON のテキストベースの形式は複雑であり、テキストをスキーマ対応のデータ構造に正しく解析するには適切なスキーマ群の検査が必要です。こうした形式にデータをシリアライズするには、検証済みデータを調べるか同等のスキーマ検査を行う必要があります。
スキーマを調査する際、起点となるスキーマが与えられたら、実装はそのスキーマとそこから $ref および allOf
キーワードのみを辿って到達可能なすべてのスキーマを検査しなければなりません(MUST)。これらのスキーマは任意のインスタンスに適用されることが保証されます。
type を検索する場合に、type キーワードの値が型のリストであり、シリアライズ値がリスト内の複数の型として解析可能で、かつ他に見つかる
type キーワードが実際に必要な型を識別しない場合、挙動は実装依存になります。
type を含まない Schema Objects
は、他のキーワードが存在してもすべての型を許容すると見なされなければなりません(例:maximum
は数値に適用されますが、インスタンスが数値であることを要求するものではありません)。
実装は oneOf や $dynamicRef のような他のキーワードのサブスキーマや参照先を調査しても良いですが(MAY)、曖昧さを解決しようとしてはなりません(MUST NOT)。
例えば anyOf を調査する場合、次のスキーマは数値型を明確に示しますが:
anyOf:
- type: number
minimum: 0
- type: number
maximum: 100
次のスキーマはそうではありません。なぜなら第二のサブスキーマがすべての型を許容するためです:
anyOf:
- type: number
- maximum: 100
これらの限定的なスキーマ検索要件により、検証済みデータにアクセスできるシリアライザは可能であればデータを検査しなければなりません(MUST)。ランタイムデータを扱わない実装(例:コードジェネレータ)や何らかの理由で検証済みデータにアクセスできない実装は、スキーマ検査にフォールバックしなければなりません(MUST)。
また JSON Schema では特定の型に適用されるキーワード(例:pattern は文字列、minimum
は数値)は、そのデータが実際にその型であることを要求・暗示しないことを思い出してください。
これらのプロセスの例として、次の OpenAPI コンポーネントがあるとします:
components:
requestBodies:
Form:
content:
application/x-www-form-urlencoded:
schema:
$ref: "#/components/schemas/FormData"
encoding:
extra:
contentType: application/xml
schemas:
FormData:
type: object
properties:
code:
allOf:
- type: [string, number]
pattern: "1"
minimum: 0
- type: string
pattern: "2"
count:
type: integer
extra:
type: object
そして次のリクエストボディをデータ形式に解析する場合:
code=1234&count=42&extra=%3Cinfo%3Eabc%3C/info%3E
まず properties などのプロパティ定義キーワードをスキーマ内で検索し、それぞれのプロパティスキーマをそのプロパティの type
キーワードを検索するための起点として使用する必要があります。順序は実装依存ですが例としては次のとおりです:
#/components/requestBodies/Form/content/application~1x-www-form-urlencoded/schema
(初期の起点スキーマ、$ref のみ)#/components/schemas/FormData($ref を辿り properties
を発見)#/components/schemas/FormData/properties/code(code プロパティの起点スキーマ)
#/components/schemas/FormData/properties/code/allOf/0(allOf を辿り
type: [string, number] を発見)
#/components/schemas/FormData/properties/code/allOf/1(allOf を辿り
type: string を発見)
#/components/schemas/FormData/properties/count(count
プロパティの起点スキーマ、type: integer を発見)#/components/schemas/FormData/properties/extra(extra
プロパティの起点スキーマ、type: object を発見)code に関しては最初に曖昧な type を見つけ、その後に別の type
キーワードを見つけて二つの可能性のうち一方のみが有効であることが確定した点に注意してください。
この検査から、code は数値のように見える文字列であり、count はスキーマ検証の前に数値に解析する必要があることが判定されます。さらに
extra は実際には info プロパティを含むオブジェクトの XML シリアライズであることがわかります。
つまりこのシリアライズのデータ形式は次の JSON オブジェクトに相当します:
{
"code": "1234",
"count": 42
"extra": {
"info": "abc"
}
}
このオブジェクトをシリアライズするには Encoding Objects
とプロパティを関連付ける必要があり、contentType
フィールドのデフォルト値を決めるための調査が必要になる場合があります。検証済みデータが利用できない場合、スキーマ検査のプロセスは解析時と同じになります。
この例では code と count はプリミティブ型で encoding
フィールドに現れないためプレーンテキストとしてシリアライズされます。しかし extra フィールドはオブジェクトであり、デフォルトでは JSON
としてシリアライズされますが、encoding フィールドの extra エントリはそれを代わりに XML
でシリアライズするよう指示しています。
OAS は raw(生)バイナリデータと encoded(エンコード済み)バイナリデータのいずれも記述できます。
multipart/* ペイロードの一部として使用する場合です。application/json や
application/x-www-form-urlencoded のようなテキストのみの形式に埋め込まれる場合に使用します(メッセージボディとしてでも
URL クエリ文字列としてでも可)。
次の表ではスキーマオブジェクトのキーワードをバイナリデータに使う方法を示すために image/png
を例として用います。任意のバイナリメディアタイプ(例:application/octet-stream)でバイナリを示すのに十分です。
| キーワード | Raw | Encoded | コメント |
|---|---|---|---|
type |
omit | string |
raw binary は 型の外側 にあります |
contentMediaType |
image/png |
image/png |
冗長であれば省略できる場合があります(下参照) |
contentEncoding |
omit | base64 または base64url |
その他のエンコーディングも 許容 されます |
contentEncoding が示すエンコーディングはデータを 7 ビット ASCII
テキストで表現するためにサイズを拡張するものであり、メッセージボディがどのように圧縮されているかを示す HTTP の Content-Encoding
ヘッダとは無関係です。HTTP はエンコードされていないバイナリメッセージボディを許容するため、全体のメッセージボディが base64 等でエンコードされていることを示す標準の HTTP
ヘッダは存在しません。
contentEncoding に base64url を使うと、(クエリ文字列や
application/x-www-form-urlencoded 型のメッセージボディで必要な)URL
エンコーディングが既にエンコード済みのバイナリデータをさらにエンコードする必要がなくなります。
contentMediaType キーワードはメディアタイプが既に次の場所で設定されている場合は冗長です:
contentType フィールド内でSchema Object が非 OAS 対応の JSON Schema 実装によって処理される場合、冗長であっても contentMediaType
を含めることが有用な場合があります。ただし、contentMediaType が関連する Media Type Object や Encoding Object
と矛盾する場合、contentMediaType は SHALL 無視されます。
ストリーミングバイナリペイロードについては Complete vs Streaming Content を参照してください。
多くの JSON Schema 実装はバイナリデータの直接サポートを持っていません。これはその仕様の必須部分ではないためです。
バイナリインスタンスをサポートする JSON Schema 実装にアクセスできない OAS 実装は、Working with Binary Data に従ってスキーマを検査し適用しなければなりません(MUST)。インスタンス全体がバイナリの場合、関連するキーワードは少ないためこれは簡単です。
しかし multipart メディアタイプはバイナリとテキストベースのデータを混在させることがあり、実装はスキーマ評価に対して二つの選択肢を持ちます:
properties, prefixItems
等)を見つけ、サブスキーマを分割してバイナリと JSON 互換データに別々に適用する。次の表は OAS 3.0 のバイナリデータ記述からの移行方法を示します。例として引き続き image/png を使用します:
| OAS < 3.1 | OAS >= 3.1 | コメント |
|---|---|---|
type: stringformat: binary |
contentMediaType: image/png |
冗長であれば省略可能で、しばしば空の Schema Object になります |
type: stringformat: byte |
type: stringcontentMediaType: image/pngcontentEncoding: base64 |
base64url を使うと base64 文字列を URL セーフに再エンコードする必要がなくなります |
JSON Schema Draft 2020-12 は注釈を収集することをサポートしており(collecting
annotations)、未認識のキーワードを注釈として扱うことも含みます(関連節)。
OAS 実装はこうした注釈や、宣言された JSON Schema 語彙の一部として認識されない拡張(extensions)を追加検証の基礎として使用してもよい(MAY)です。
JSON Schema Draft 2020-12 は拡張に x- プレフィックスを必須としない点に注意してください。
format
キーワード(デフォルトの format-annotation 語彙を使用する場合) や contentMediaType,
contentEncoding, および contentSchema キーワード
はデータに対する制約を定義しますが、直接検証されるのではなく注釈として扱われます。拡張検証はこれらの制約を適用する一つの方法です(MAY)。
readOnly と writeOnly キーワードは注釈です。JSON Schema
は検証対象データがどのように使用されるかを認識しないためです。
これらのキーワードの検証は注釈、読み取りまたは書き込みの方向、および(該当する場合)フィールドの現在の値をチェックすることで行われることが MAY あります。
JSON
Schema Validation Draft 2020-12 セクション9.4 はこれらのキーワードの期待動作を定義しており、リソース(「所有権を持つ権限」と記述される)は
MAY readOnly フィールドを無視するかエラーとして扱うことができます。
必須かつ読み取り専用であるフィールドは、特に値が変更されていない場合に PUT で readOnly: true の制約を無視することが有益な例です。これにより GET
でフィールドを正しく必須にしつつ、PUT では同じ表現とスキーマを使用できます。
読み取り専用フィールドが必須でない場合でも、それらを削除することはクライアントにとって負担となり、特に JSON データが複雑または深くネストされている場合に顕著です。
readOnly の振る舞いは特に本仕様のバージョン 3.0 で指定されていたものと異なる点があることに注意してください。
OpenAPI 仕様は JSON Schema の allOf
キーワードを使用してモデル定義の結合や拡張を可能にし、実質的にモデルのコンポジションを提供します。allOf
は独立して検証されるオブジェクト定義の配列を取り、それらが組み合わさって単一のオブジェクトを構成します。
コンポジションはモデルの拡張性を提供しますが、モデル間の階層を意味するものではありません。
JSON Schema はまた anyOf と oneOf
キーワードを提供しており、それぞれ少なくとも一つ、または正確に一つのスキーマが有効であることを定義できます。allOf
と同様に、これらのスキーマは独立して検証されます。これらのキーワードは単一フィールドが複数の値の型を受け入れるポリモーフィズムを記述するために使用できます。
OpenAPI 仕様はポリモーフィズムのサポートを拡張して discriminator
フィールド(値は Discriminator Object)を追加します。使用時、Discriminator
Object は anyOf や oneOf のどのスキーマがモデルの構造を検証することが期待されるかを示すプロパティ名を指示します。
識別プロパティは MAY 必須または任意として定義できますが、任意として定義される場合、Discriminator Object はどの
anyOf または oneOf のスキーマ、あるいは allOf
内で現在のスキーマを参照するどのスキーマが識別プロパティが存在しないときにモデルの構造を検証するかを指定する defaultMapping
フィールドを含めなければなりません(MUST)。
継承インスタンスの識別プロパティの値を定義する方法は二つあります:
実装は JSON Schema の動的参照機能を使用してジェネリックまたはテンプレートデータ構造を定義することを SHOULD サポートするべきです:
$dynamicAnchor は $dynamicRef
が解決できる可能性のあるスキーマ群(デフォルトのプレースホルダスキーマを含む)を識別します。$dynamicRef はスキーマの起点から参照までのパス上で最初に見つかる一致する $dynamicAnchor
に解決します(JSON Schema 仕様の説明による)。例は下の Schema Object Examples セクションに含まれており、詳細は Learn OpenAPI サイトの “Dynamic References” ページを参照してください。
Schema Object の enum キーワードは個々の値に説明やその他の情報を関連付けることを許しません。
実装は各サブスキーマが const キーワードと title や description のような注釈を含む
oneOf や anyOf を列挙型として追加情報付きで認識することを MAY
サポートする場合があります。このパターンの正確な振る舞いは JSON Schema によって要求される範囲を超えて実装依存です。
xml フィールドは JSON 定義を XML に変換する際の追加定義を許します。 XML Object は利用可能なオプションに関する追加情報を含みます。
どのダイアレクトやメタスキーマでリソースを処理するか(JSON Schema Core、JSON Schema Validation、OpenAPI Schema ダイアレクト、あるいはカスタムメタスキーマ)をツールが判別できることは重要です。
$schema キーワードは スキーマリソースのルート
である Schema Object に存在しても MAY であり、存在する場合はスキーマを処理する際にどのダイアレクトを使うべきかを決定するために
MUST 使用されなければなりません。これによりデフォルトの Draft 2020-12 以外の JSON Schema 草案に準拠する Schema
Object を使用できるようになります。ツールは OAS dialect schema id をサポートしなければなりません(MUST)、および $schema の追加値をサポートしてもよい(MAY)です。
OAS ドキュメント内のすべての Schema Object に対する異なるデフォルトの $schema 値を使用できるように、OpenAPI Object 内に
jsonSchemaDialect の値を設定することができます。このデフォルトが設定されていない場合、OAS ダイアレクトスキーマ ID がこれらの Schema
Object に対して使用されなければなりません(MUST)。リソースルートの Schema Object 内の
$schema の値は常にデフォルトを上書きします。
$schema を設定していない独立した JSON Schema 文書、または完全な文書ではない OpenAPI 記述ドキュメント内の Schema Object
に対しては、ダイアレクトは OAS ダイアレクトであると仮定することが SHOULD です。
しかし最大の相互運用性のために、OpenAPI 記述の作成者はそのような文書で明示的に $schema を設定することが RECOMMENDED です。
type: string
format: email
type: object
required:
- name
properties:
name:
type: string
address:
$ref: '#/components/schemas/Address'
age:
type: integer
format: int32
minimum: 0
単純な文字列→文字列のマッピングの場合:
type: object
additionalProperties:
type: string
文字列→モデルのマッピングの場合:
type: object
additionalProperties:
$ref: '#/components/schemas/ComplexModel'
oneOf:
- const: RGB
title: Red, Green, Blue
description: Specify colors with the red, green, and blue additive color model
- const: CMYK
title: Cyan, Magenta, Yellow, Black
description: Specify colors with the cyan, magenta, yellow, and black subtractive color model
type: object
properties:
id:
type: integer
format: int64
name:
type: string
required:
- name
examples:
- name: Puma
id: 1
components:
schemas:
ErrorModel:
type: object
required:
- message
- code
properties:
message:
type: string
code:
type: integer
minimum: 100
maximum: 600
ExtendedErrorModel:
allOf:
- $ref: '#/components/schemas/ErrorModel'
- type: object
required:
- rootCause
properties:
rootCause:
type: string
次の例は Pet モデルを示しており、petType プロパティによって猫か犬かを表現できます。各ペット種にはベースの
Pet モデル以外の追加プロパティがあります。petType プロパティが存在しない、または cat や
dog に一致しない値の場合、そのインスタンスは無効です。
components:
schemas:
Pet:
type: object
properties:
name:
type: string
required:
- name
- petType
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
Cat:
description: A pet cat
type: object
properties:
petType:
const: 'cat'
huntingSkill:
type: string
description: The measured skill for hunting
enum:
- clueless
- lazy
- adventurous
- aggressive
required:
- huntingSkill
Dog:
description: A pet dog
type: object
properties:
petType:
const: 'dog'
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
required:
- packSize
次の例は前節の例を拡張し、Pet スキーマに Discriminator Object
を追加しています。Discriminator Object は API の利用者へのヒントにすぎず、スキーマの検証結果を変更するものではないことに注意してください。
components:
schemas:
Pet:
type: object
discriminator:
propertyName: petType
mapping:
cat: '#/components/schemas/Cat'
dog: '#/components/schemas/Dog'
properties:
name:
type: string
required:
- name
- petType
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
Cat:
description: A pet cat
type: object
properties:
petType:
const: 'cat'
huntingSkill:
type: string
description: The measured skill for hunting
enum:
- clueless
- lazy
- adventurous
- aggressive
required:
- huntingSkill
Dog:
description: A pet dog
type: object
properties:
petType:
const: 'dog'
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
required:
- petType
- packSize
allOf を使ってポリモーフィックなモデルを記述することも可能です。次の例は allOf と Discriminator Object を用いてポリモーフィックな Pet
モデルを説明しています。
components:
schemas:
Pet:
type: object
discriminator:
propertyName: petType
properties:
name:
type: string
petType:
type: string
required:
- name
- petType
Cat: # "Cat" will be used as the discriminating value
description: A representation of a cat
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
properties:
huntingSkill:
type: string
description: The measured skill for hunting
enum:
- clueless
- lazy
- adventurous
- aggressive
required:
- huntingSkill
Dog: # "Dog" will be used as the discriminating value
description: A representation of a dog
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
properties:
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
required:
- packSize
components:
schemas:
genericArrayComponent:
$id: fully_generic_array
type: array
items:
$dynamicRef: '#generic-array'
$defs:
allowAll:
$dynamicAnchor: generic-array
numberArray:
$id: array_of_numbers
$ref: fully_generic_array
$defs:
numbersOnly:
$dynamicAnchor: generic-array
type: number
stringArray:
$id: array_of_strings
$ref: fully_generic_array
$defs:
stringsOnly:
$dynamicAnchor: generic-array
type: string
objWithTypedArray:
$id: obj_with_typed_array
type: object
required:
- dataType
- data
properties:
dataType:
enum:
- string
- number
oneOf:
- properties:
dataType:
const: string
data:
$ref: array_of_strings
- properties:
dataType:
const: number
data:
$ref: array_of_numbers
リクエストボディやレスポンスのペイロードが複数の異なるスキーマのいずれかであり得る場合、これらは可能なスキーマを記述するために JSON Schema の anyOf または
oneOf キーワードを使用するべきです(Composition and
Inheritance を参照)。
ポリモーフィックなスキーマは MAY Discriminator Object を含めることができ、これは anyOf や
oneOf のどのスキーマ、あるいは allOf
内で現在のスキーマを参照するどのスキーマがモデルの構造を検証することが期待されるかのヒントとして使えるプロパティ名を定義します。
このヒントはシリアライズ、デシリアライズ、検証の支援に利用できます。
Discriminator Object は、名前付きプロパティの可能な値を暗黙的または明示的に別のスキーマに関連付けることでこれを行います。
discriminator はスキーマの検証結果を変更してはならないことに注意してください(MUST NOT)。
| フィールド名 | 型 | 説明 |
|---|---|---|
| propertyName | string |
REQUIRED。ペイロード内で識別値を保持する識別用プロパティの名前です。識別用プロパティは
MAY 必須または任意として定義できますが、任意として定義する場合、Discriminator Object
は識別プロパティが存在しない場合にモデルの構造を検証することが期待されるスキーマを指定する defaultMapping フィールドを MUST 含める必要があります。
|
| mapping | Map[string, string] |
ペイロードの値とスキーマ名または URI 参照との間のマッピングを保持するオブジェクトです。 |
| defaultMapping | string |
ペイロードに識別プロパティが存在しない、または明示的・暗黙的マッピングが存在しない値を含む場合にモデルの構造を検証することが期待されるスキーマ名またはスキーマへの URI 参照です。 |
このオブジェクトは MAY Specification Extensions によって拡張できます。
Discriminator Object
は合成キーワードのいずれか(oneOf、anyOf、allOf)を使用している場合にのみ合法です。
oneOf と anyOf の両方のユースケースでは、これらのキーワードが discriminator
に隣接している場合、すべての可能なスキーマを明示的に列挙しなければなりません(MUST)。
冗長性を避けるために、discriminator を親スキーマ定義に追加し、親スキーマを allOf
の構成で利用して構築されるすべてのスキーマを代替スキーマとして使用することが MAY あります。
allOf 形式の discriminator は検証以外のユースケースでのみ有用であることに注意してください;この形式の
discriminator を持つ親スキーマによる検証は子スキーマを検索したり、検証に使用したりはしません。これは discriminator
が検証結果を変更できないことと、親スキーマを子スキーマに結びつける標準的な JSON Schema キーワードが存在しないためです。
上記に記述されていない oneOf、anyOf、allOf と discriminator
の任意の構成の振る舞いは未定義です。
propertyName で指定されたプロパティの値は、該当する場合 Components Object
の下のスキーマ名として使用されます。ただしその値に対して mapping が存在する場合は例外です。
mapping エントリは特定のプロパティ値を別のスキーマコンポーネント名、または URI で識別されるスキーマにマップします。
暗黙または明示のスキーマコンポーネント名を使用する場合、インラインの oneOf や anyOf のサブスキーマは考慮されません。
mapping 値や defaultMapping 値が有効なスキーマ名と有効な相対 URI
参照の両方である場合の動作は実装依存ですが、スキーマ名として扱うことが RECOMMENDED です。
あいまいな値(例: "foo")をすべての実装で相対 URI 参照として扱いたい場合、作成者は "./foo" のように
"." パスセグメントでプレフィックスする必要があります(MUST)。
マッピングキーは文字列値でなければなりません(MUST)。ただしツールは比較のためにレスポンス値を文字列に変換してもよい(MAY)ですが、そのような変換の正確な性質は実装依存です。
識別用プロパティが任意として定義されている場合、Discriminator Object
は、識別プロパティがペイロードに存在しないか、明示的または暗黙のマッピングがない値を含む場合にモデルの構造を検証することが期待されるスキーマを指定する
defaultMapping フィールドを MUST
含める必要があります。これにより識別用プロパティが欠落していてもスキーマを正しく検証できます。
任意の識別用プロパティの主な使用例は、識別子を追加しても識別用プロパティを提供しない既存クライアントを壊さないようにスキーマを拡張できるようにすることです。
識別用プロパティが任意として定義される場合、識別プロパティの値を定義する各サブスキーマはそのプロパティを必須として定義することが重要です。なぜなら親スキーマによる強制がもはや働かないためです。
defaultMapping
のスキーマは、識別用プロパティが存在するが明示的または暗黙のマッピングがない値を含む場合にもモデルの構造を検証することが期待されます。これは通常、defaultMapping
スキーマで識別用プロパティのマッピングされた値を除外することで表現されます。例:
OtherPet:
type: object
properties:
petType:
not:
enum: ['cat', 'dog']
これにより、oneOf を使ったポリモーフィズム記述で、識別用プロパティにマッピングされた値が含まれるペイロードに対して defaultMapping
スキーマが検証してしまい検証失敗になることを防ぎます。
これらの例では、すべてのスキーマが OAD の エントリドキュメント にあると仮定します;参照ドキュメントでの
discriminator の扱いについては Resolving Implicit
Connections を参照してください。
OAS 3.x では、レスポンスペイロードは任意の数の型のうちちょうど一つであると記述してもよい(MAY):
MyResponseType:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
これは有効なペイロードが Cat, Dog, または Lizard
のスキーマのうち正確に一つにマッチしなければならないことを意味します。oneOf
のデシリアライズはどのスキーマがペイロードにマッチするかを判定する必要があるためコストがかかる操作になり得ます。この問題は anyOf
スキーマにも存在します。discriminator はマッチするスキーマの選択効率を向上させるための「ヒント」として使えます。Discriminator Object は
oneOf
の検証結果を変更することはできず、デシリアライズをより効率的にし、エラーメッセージを改善することにのみ役立ちます。どのフィールドがインスタンスに一致するスキーマを示すかを正確に指定することができます:
MyResponseType:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
discriminator:
propertyName: petType
ここで期待されるのは、レスポンスペイロードに petType という名前のプロパティが存在し(MUST)、その値が
OpenAPI 記述で定義されたスキーマ名に対応することです。したがって次のようなレスポンスペイロードは:
{
"id": 12345,
"petType": "Cat"
}
このペイロードが Cat スキーマがこのペイロードにマッチすることを示します。
識別用プロパティの値がスキーマ名に一致しない、または暗黙的マッピングが不可能なシナリオでは、オプションの mapping 定義を使用できます:
MyResponseType:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
- $ref: https://gigantic-server.com/schemas/Monster/schema.json
discriminator:
propertyName: petType
mapping:
dog: '#/components/schemas/Dog'
monster: https://gigantic-server.com/schemas/Monster/schema.json
ここでは識別値 dog がデフォルト(暗黙)値の #/components/schemas/dog ではなく
#/components/schemas/Dog にマップされます。識別値が暗黙または明示のいずれのマッピングにも一致しない場合はスキーマを決定できず、検証は SHOULD 失敗すべきです。
anyOf 構成と組み合わせて使用すると、複数のスキーマが単一のペイロードを満たす可能性がある場合にシリアライザ/デシリアライザの曖昧さを回避できます。
識別用プロパティが任意として定義されている場合、Discriminator Object は anyOf または oneOf
のどのスキーマが識別プロパティが存在しないペイロードを検証することが期待されるかを指定する defaultMapping
フィールドを含める必要があります。これにより識別子プロパティが欠落していてもスキーマを正しく検証できます。
例えば:
MyResponseType:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
- $ref: '#/components/schemas/OtherPet'
discriminator:
propertyName: petType
defaultMapping: OtherPet
OtherPet:
type: object
properties:
petType:
not:
enum: ['Cat', 'Dog', 'Lizard']
この例では、ペイロードに petType プロパティが存在しない、または petType の値が “Cat”, “Dog”, “Lizard”
のいずれでもない場合、そのペイロードは OtherPet スキーマに対して検証されるべきです。
次に示す例は allOf の使用を示しており、親で全ての子スキーマを参照する必要を回避します:
components:
schemas:
Pet:
type: object
required:
- petType
properties:
petType:
type: string
discriminator:
propertyName: petType
mapping:
dog: Dog
Cat:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Cat`
properties:
name:
type: string
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: string
Lizard:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Lizard`
properties:
lovesRocks:
type: boolean
Pet スキーマに対して検証した場合、次のようなペイロード:
{
"petType": "Cat",
"name": "Misty"
}
は #/components/schemas/Cat スキーマがマッチすることを示します。同様に次のペイロードは:
{
"petType": "dog",
"bark": "soft"
}
は mapping 要素の dog エントリが
Dog(#/components/schemas/Dog のスキーマ名)にマップされているため
#/components/schemas/Dog にマップされます。
XML モデル定義をより細かく指定するためのメタデータオブジェクトです。 Schema Object を XML と共に使用する際、XML Object が存在しない場合の挙動は XML Object のデフォルトフィールド値によって決定されます。
| フィールド名 | 型 | 説明 |
|---|---|---|
| nodeType | string |
XML Node Types に記載のとおり、element,
attribute, text, cdata, または none
のいずれかです。$ref, $dynamicRef, または type: "array" が Schema Object 内に存在する場合のデフォルト値は none、それ以外では
element です。
|
| name | string |
スキーマに対応する要素/属性の名前を設定し、XML Node Names
に記載の推論された名前を置き換えます。このフィールドは nodeType が text,
cdata, または none の場合は SHALL 無視されます。
|
| namespace | string |
名前空間定義の IRI([RFC3987])です。値は相対でない IRI の形式でなければなりません(MUST)。 |
| prefix | string |
name に対して使用されるプレフィックスです。 |
| attribute | boolean |
プロパティ定義が要素ではなく属性に変換されるかどうかを宣言します。デフォルトは false です。nodeType
が存在する場合、このフィールドは MUST NOT
存在してはなりません。Deprecated: attribute: true の代わりに
nodeType: "attribute" を使用してください。
|
| wrapped | boolean |
配列定義にのみ MAY 使用できます。配列がラップされているか(例:
<books><book/><book/></books>)それともラップされていないか(例:
<book/><book/>)を示します。デフォルトは false です。定義は
type が "array"(items
の外側)と共に定義された場合にのみ効果を発揮します。nodeType が存在する場合、このフィールドは MUST NOT 存在してはなりません。Deprecated: wrapped: true の代わりに nodeType: "element" を使用してください。
|
オブジェクトデータから XML ドキュメントを生成する際、ノードの順序は未定義であることに注意してください。ノード順序を制御するには Ordered Elements and Text に示すように prefixItems
を使用してください。
様々な型の値を文字列表現に変換する議論については Appendix B を参照してください。
このオブジェクトは MAY Specification Extensions によって拡張できます。
各 Schema Object は nodeType フィールドで指定される特定の種類の XML [DOM] node を記述します。これらの値のうち特殊な値
none を除き、DOM 仕様における数値等価が括弧内に示されています:
element (1): スキーマは要素を表し、その内容を記述しますattribute (2): スキーマは属性を表し、その値を記述しますtext (3): スキーマはテキストノード(解析済み文字データ)を表しますcdata (4): スキーマは CDATA セクションを表しますnone: スキーマは XML ドキュメント内のいかなるノードにも対応せず、そのサブスキーマに対応するノードは親スキーマのノードの直下に直接含まれますnone 型は、構造を示唆するのではなく再利用を促進するためだけに存在する $ref のみを含むスキーマのような、XML ノードより多くの
Schema Object を必要とする JSON Schema 構成に有用です。
互換性の理由から、type: "array" のスキーマはデフォルトで nodeType: "none"
となり、各配列アイテムのノードが親ノードの直下に配置されます。これは XML Node Names
に定義された推論命名の振る舞いとも一致します。
リストを包む要素を生成するには、type: "array" スキーマに明示的に nodeType: "element"
を設定してください。その際、ラップ要素またはアイテム要素のいずれかに明示的な名前を設定して、同じ推論名が両方に使われることを避けることを推奨します。期待される振る舞いの例を参照してください。
もし element ノードがプリミティブ型を持つ場合、そのスキーマは、プロパティ名(または name フィールド)で命名された
element ノードの内容を記述する暗黙の text ノードも生成します。
要素に属性と内容の両方がある場合は明示的な text ノードが必要です。
隣接して2つの text ノードを置くことは解析において曖昧であり、その結果の振る舞いは実装依存であることに注意してください。
element と attribute のノードタイプは名前を必要とし、その名前は name
フィールドでオーバーライドされない限り以下のようにスキーマから推論されなければなりません(MUST):
schemas
フィールド直下のスキーマの場合、コンポーネント名が推論名になります。schema
フィールド下のインラインスキーマ)のように、推論できる名前がない場合は name フィールドを持つ XML Object が MUST 存在する必要があります。配列を使用する場合、単数形と複数形の推論は行われないため、明示的に設定する必要があることに注意してください。
namespace フィールドは XML namespaces
の構文に一致することを意図していますが、いくつか注意点があります:
XML はデフォルトで null に相当する概念を持たないため、本仕様のバージョン 3.1.1 以前との互換性を保つために、null
値のシリアライズの挙動は実装依存です。
しかしながら、実装は次のように null 値を扱うことが SHOULD です:
xsi:nil="true" 属性を持つ空の要素を生成する。属性に関しては、これにより null 値または欠落したプロパティのいずれも属性が省略される形でシリアライズされます。Schema Object
はインメモリ表現を検証するため、これは null と必須プロパティの組み合わせの扱いを可能にします。しかし、属性として null
を表す明確な方法がないため、属性プロパティは null を使うよりもオプショナルにすることが RECOMMENDED です。
正しいラウンドトリップ動作を確保するため、属性を省略する要素を解析する際、実装はスキーマがその値を許容する場合(例:type: ["number", "null"])に対応するプロパティを
null に設定することを SHOULD、そうでなければプロパティを省略することを推奨します(例:type: "number")。
Schema Objects の後に、そのスキーマから生成される例示的な XML 表現が続きます。attribute や wrapped
を使った例については OpenAPI Specification バージョン 3.1 を参照してください。
XML Object を持たない基本的な文字列プロパティ、ここでは serializedValue を使用します(残りの例は XML 形式を構文強調表示できるように
externalValue を使用します):
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: string
examples:
pets:
dataValue:
animals: dog, cat, hamster
serializedValue: |
<document>
<animals>dog, cat, hamster</animals>
</document>
基本的な文字列配列プロパティ(デフォルトで nodeType は none):
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
items:
type: string
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animals>dog</animals>
<animals>cat</animals>
<animals>hamster</animals>
</document>
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: string
xml:
name: animal
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animal>dog</animal>
<animal>cat</animal>
<animal>hamster</animal>
</document>
ルート XML 要素の名前はコンポーネント名から来ることに注意してください。
components:
schemas:
Person:
type: object
properties:
id:
type: integer
format: int32
xml:
nodeType: attribute
name:
type: string
xml:
namespace: https://example.com/schema/sample
prefix: sample
requestBodies:
Person:
content:
application/xml:
schema:
$ref: "#/components/schemas/Person"
examples:
Person:
dataValue:
id: 123
name: example
externalValue: ./examples/Person.xml
ここで ./examples/Person.xml は次のようになります:
<Person id="123">
<sample:name xmlns:sample="https://example.com/schema/sample">example</sample:name>
</Person>
要素名の変更:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
items:
type: string
xml:
name: animal
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animal>dog</animal>
<animal>cat</animal>
<animal>hamster</animal>
</document>
type: "array" スキーマの name フィールドは、そのオブジェクトのデフォルト nodeType が
none であるため影響を与えません:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
xml:
name: aliens
items:
type: string
xml:
name: animal
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animal>dog</animal>
<animal>cat</animal>
<animal>hamster</animal>
</document>
明示的に nodeType を element
に設定してラップ要素を作成する場合でも、名前が明示されていなければラップ要素とリストアイテム要素の両方に同じ名前が使用されます:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
xml:
nodeType: element
items:
type: string
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animals>
<animals>dog</animals>
<animals>cat</animals>
<animals>hamster</animals>
</animals>
</document>
上の例の命名問題を回避するために、次の定義を使用できます:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
xml:
nodeType: element
items:
type: string
xml:
name: animal
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<animals>
<animal>dog</animal>
<animal>cat</animal>
<animal>hamster</animal>
</animals>
</document>
ラップ要素とアイテム要素の名前の両方に影響を与える場合:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
xml:
name: aliens
nodeType: element
items:
type: string
xml:
name: animal
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<aliens>
<animal>dog</animal>
<animal>cat</animal>
<animal>hamster</animal>
</aliens>
</document>
ラップ要素名を変更したがアイテム要素名は変更しない場合:
application/xml:
schema:
type: object
xml:
name: document
properties:
animals:
type: array
xml:
name: aliens
nodeType: element
items:
type: string
examples:
pets:
dataValue:
animals:
- dog
- cat
- hamster
externalValue: ./examples/pets.xml
ここで ./examples/pets.xml は次のようになります:
<document>
<aliens>
<aliens>dog</aliens>
<aliens>cat</aliens>
<aliens>hamster</aliens>
</aliens>
</document>
application/xml:
schema:
type: array
xml:
nodeType: element
name: animals
items:
xml:
name: animal
properties:
kind:
type: string
xml:
nodeType: attribute
name:
type: string
xml:
nodeType: text
examples:
pets:
dataValue:
- kind: Cat
name: Fluffy
- kind: Dog
name: Fido
ここで ./examples/pets.xml は次のようになります:
<animals>
<animal kind="Cat">Fluffy</animals>
<animal kind="Dog">Fido</animals>
<animals>
この例では、$ref のみを含む Schema Object に対して要素は作成されません。これはその nodeType のデフォルトが
none であるためです。CDATA セクションのためにサブスキーマを作成する必要があります。さもないと内容が暗黙の text
ノードとして扱われてしまいます。
components:
schemas:
Documentation:
type: object
properties:
content:
type: string
contentMediaType: text/html
xml:
nodeType: cdata
responses:
content:
application/xml:
schema:
$ref: "#/components/schemas/Documentation"
examples:
docs:
dataValue:
content: <html><head><title>Awesome Docs</title></head><body></body><html>
externalValue: ./examples/docs.xml
ここで ./examples/docs.xml は次のようになります:
<Documentation>
<![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</Documentation>
あるいは、名前付きルート要素を使用箇所で設定し、コンポーネントのルート要素を無効にすることもできます(この例では同じ dataValue
が異なるシリアライズで二箇所に使われており、externalValue で示されています):
paths:
/docs:
get:
responses:
"200":
content:
application/xml:
schema:
xml:
nodeType: element
name: StoredDocument
$ref: "#/components/schemas/Documentation"
examples:
stored:
dataValue:
content: <html><head><title>Awesome Docs</title></head><body></body><html>
externalValue: ./examples/stored.xml
put:
requestBody:
required: true
content:
application/xml:
schema:
xml:
nodeType: element
name: UpdatedDocument
$ref: "#/components/schemas/Documentation"
examples:
updated:
dataValue:
content: <html><head><title>Awesome Docs</title></head><body></body><html>
externalValue: ./examples/updated.xml
responses:
"201": {}
components:
schemas:
Documentation:
xml:
nodeType: none
type: object
properties:
content:
type: string
contentMediaType: text/html
xml:
nodeType: cdata
ここで ./examples/stored.xml は次のようになり、
<StoredDocument>
<![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</StoredDocument>
また ./examples/updated.xml は次のようになります:
<UpdatedDocument>
<![CDATA[<html><head><title>Awesome Docs</title></head><body></body><html>]]>
</UpdatedDocument>
要素の正確な順序を制御するには prefixItems キーワードを使用してください。
このアプローチでは、要素名を XML Object を使って設定する必要があります。さもないと、それらは特定の順序であっても親の名前を継承してしまいます。
配列のシーケンスを含む要素を得るためには配列に対して nodeType: "element" を明示的に設定することも必要です。
最初の順序付きの例は要素のシーケンスを示しており、要素に対する null の推奨されるシリアライズも示しています:
application/xml:
schema:
xml:
nodeType: element
name: OneTwoThree
type: array
minLength: 3
maxLength: 3
prefixItems:
- xml:
name: One
type: string
- xml:
name: Two
type: object
required:
- unit
- value
properties:
unit:
type: string
xml:
nodeType: attribute
value:
type: number
xml:
nodeType: text
- xml:
name: Three
type:
- boolean
- "null"
examples:
OneTwoThree:
dataValue:
- Some text
- unit: cubits
value: 42
null
]
externalValue: ./examples/OneTwoThree.xml
ここで ./examples/OneTwoThree.xml は次のようになります:
<OneTwoThree>
<One>Some text</One>
<Two unit="cubits">42</Two>
<Three xsi:nil="true" />
</OneTwoThree>
次の例では、要素に対して name を設定する必要があり、テキストノードに対しては nodeType を設定する必要があります。
application/xml:
schema:
xml:
nodeType: element
name: Report
type: array
prefixItems:
- xml:
nodeType: text
type: string
- xml:
name: data
type: number
- xml:
nodeType: text
type: string
examples:
Report:
dataValue:
- Some preamble text.
- 42
- Some postamble text.
externalValue: ./examples/Report.xml
ここで ./examples/Report.xml は次のようになります:
<Report>Some preamble text.<data>42</data>Some postamble text.</Report>
スキーマは XML ドキュメント自体ではなくインメモリのデータを検証することを思い出してください。
この例は空のオブジェクトと null の扱いを示しているため、"related" のプロパティは定義していません。
application/xml:
schema:
xml:
name: product
type: object
required:
- count
- description
- related
properties:
count:
type:
- number
- "null"
xml:
nodeType: attribute
rating:
type: string
xml:
nodeType: attribute
description:
type: string
related:
type:
- object
- "null"
examples:
productWithNulls:
dataValue:
count: null
description: Thing
related: null
externalValue: ./examples/productWithNulls.xml
productNoNulls:
dataValue:
count: 42
description: Thing
related: {}
externalValue: ./examples/productNoNulls.xml
ここで ./examples/productWithNulls.xml は次のようになります:
<product>
<description>Thing</description>
<related xsi:nil="true" />
</product>
また ./examples/productNoNulls.xml は次のようになります:
<product count="42">
<description>Thing</description>
<related></related>
</product>
Operations で使用できるセキュリティスキームを定義します。
サポートされるスキームには HTTP 認証、API キー(ヘッダー、クッキー パラメータ、またはクエリ パラメータとして)、相互 TLS(クライアント証明書の使用)、および [RFC6749] に定義された OAuth2 の一般的なフロー(implicit、password、client credentials、authorization code)、[RFC8628] に定義された OAuth2 デバイス認可フロー、および [OpenID-Connect-Core] が含まれます。2020 年時点では implicit フローは OAuth 2.0 Security Best Current Practice により廃止予定であることに注意してください。ほとんどのユースケースに推奨されるのは PKCE を伴う Authorization Code Grant フローです。
| フィールド名 | 型 | 適用対象 | 説明 |
|---|---|---|---|
| type | string |
Any | REQUIRED。セキュリティスキームの種類です。
有効な値は "apiKey", "http", "mutualTLS",
"oauth2", "openIdConnect" です。
|
| description | string |
Any | セキュリティスキームの説明です。[CommonMark] 構文はリッチテキスト表現に MAY 使用できます。 |
| name | string |
apiKey |
REQUIRED。使用するヘッダー、クエリ、またはクッキー パラメータの名前です。 |
| in | string |
apiKey |
REQUIRED。API キーの配置場所です。"query",
"header", または "cookie" が有効な値です。
|
| scheme | string |
http |
REQUIRED。Authorization ヘッダで使用される HTTP 認証スキームの名前です([RFC9110] の Section 16.4.1 で定義)。使用する値は IANA Authentication Scheme registry に登録されていることが SHOULD。値は [RFC9110] の Section 11.1 に従い大文字小文字を区別しません。 |
| bearerFormat | string |
http ("bearer") |
ベアラートークンがどのようにフォーマットされているかをクライアントに示すヒントです。ベアラートークンは通常認可サーバによって生成されるため、この情報は主にドキュメント目的です。 |
| flows | OAuth Flows Object | oauth2 |
REQUIRED。サポートされるフロータイプの構成情報を含むオブジェクトです。 |
| openIdConnectUrl | string |
openIdConnect |
REQUIRED。プロバイダメタデータを検出するための Well-known URL([OpenID-Connect-Discovery] の provider metadata を発見するための URL)。 |
| oauth2MetadataUrl | string |
oauth2 |
OAuth2 認可サーバのメタデータへの URL([RFC8414])。TLS が必要です。 |
| deprecated | boolean |
Any | このセキュリティスキームが廃止予定であることを宣言します。利用者はこのスキームの使用を控えることが SHOULD
推奨されます。デフォルトは false です。 |
このオブジェクトは MAY Specification Extensions によって拡張できます。
type: http
scheme: basic
type: apiKey
name: api-key
in: header
type: http
scheme: bearer
bearerFormat: JWT
type: mutualTLS
description: Cert must be signed by example.com CA
type: oauth2
flows:
implicit:
authorizationUrl: https://example.com/api/oauth/dialog
scopes:
write:pets: modify pets in your account
read:pets: read your pets
サポートされる OAuth フローの設定を許可します。
| フィールド名 | 型 | 説明 |
|---|---|---|
| implicit | OAuth Flow Object | OAuth Implicit フローの設定 |
| password | OAuth Flow Object | OAuth Resource Owner Password フローの設定 |
| clientCredentials | OAuth Flow Object | OAuth Client Credentials フローの設定。OpenAPI 2.0 では以前 application と呼ばれていました。
|
| authorizationCode | OAuth Flow Object | OAuth Authorization Code フローの設定。OpenAPI 2.0 では以前 accessCode と呼ばれていました。 |
| deviceAuthorization | OAuth Flow Object | OAuth Device Authorization フローの設定。 |
このオブジェクトは MAY Specification Extensions によって拡張できます。
サポートされる OAuth フローの設定の詳細
| フィールド名 | 型 | 適用対象 | 説明 |
|---|---|---|---|
| authorizationUrl | string |
oauth2 ("implicit", "authorizationCode") |
REQUIRED。このフローで使用される認可 URL。これは URL 形式であることが MUST。OAuth2 標準では TLS の使用を要求します。 |
| deviceAuthorizationUrl | string |
oauth2 ("deviceAuthorization") |
REQUIRED。このフローで使用されるデバイス認可 URL。これは URL 形式であることが MUST。OAuth2 標準では TLS の使用を要求します。 |
| tokenUrl | string |
oauth2 ("password", "clientCredentials",
"authorizationCode", "deviceAuthorization")
|
REQUIRED。このフローで使用されるトークン URL。これは URL 形式であることが MUST。OAuth2 標準では TLS の使用を要求します。 |
| refreshUrl | string |
oauth2 |
リフレッシュトークンを取得するために使用される URL。これは URL 形式であることが MUST。OAuth2 標準では TLS の使用を要求します。 |
| scopes | Map[string, string] |
oauth2 |
REQUIRED。OAuth2 セキュリティスキームで利用可能なスコープ。スコープ名とその短い説明のマップ。マップは空でもよい(MAY)。 |
このオブジェクトは MAY Specification Extensions によって拡張できます。
type: oauth2
flows:
implicit:
authorizationUrl: https://example.com/api/oauth/dialog
scopes:
write:pets: modify pets in your account
read:pets: read your pets
authorizationCode:
authorizationUrl: https://example.com/api/oauth/dialog
tokenUrl: https://example.com/api/oauth/token
scopes:
write:pets: modify pets in your account
read:pets: read your pets
この操作を実行するために必要なセキュリティスキームの一覧。
各プロパティに使用される名前は、Components Object の下の Security Schemes に宣言されたセキュリティスキームに対応するか、または Security Scheme Object の
URI でなければなりません(MUST)。Components Object
のコンポーネント名と同一のプロパティ名はコンポーネント名として扱われること(MUST)。単一セグメントの相対 URI 参照(例:
foo)がコンポーネント名と衝突する場合(例: #/components/securitySchemes/foo)、./foo
のように . パスセグメントを使って参照してください。
URI のように見える Security Scheme コンポーネント名を使用することは、以前の OAS との互換性を維持するためにコンポーネント名一致が URI 解決よりも優先されるという直感に反する挙動を生むため、NOT RECOMMENDED です。詳細は Security Considerations を参照してください。
Security Requirement Object は複数のセキュリティスキームを参照してもよく(MAY)、その場合はすべてのスキームが要求され、リクエストの認可のためにはすべて満たされる必要があります(MUST)。これは複数のクエリパラメータまたは HTTP ヘッダでセキュリティ情報を伝える必要があるシナリオをサポートします。
OpenAPI Object または Operation Object 上で
security フィールドが定義され、複数の Security Requirement Object
を含む場合、リスト内のいずれか一つのエントリを満たせばリクエストの認可が可能です。これは API が複数の独立したセキュリティスキームを許容する場合のサポートを可能にします。
空の Security Requirement Object ({}) は匿名アクセスがサポートされることを示します。
| フィールドパターン | 型 | 説明 |
|---|---|---|
| {name} | [string] |
各名前または URI は上で説明したセキュリティスキームに対応しなければなりません(MUST)。セキュリティスキームが
"oauth2" または "openIdConnect"
の場合、値は実行に必要なスコープ名のリストであり、認可が特定のスコープを要求しない場合はリストは空でもよい(MAY)。他のスキームタイプでは、配列は実行に必要なロール名のリストを含むことが MAY ありますが、それらは定義されていないか、帯域内で交換されるわけではありません。
|
マルチドキュメントの OpenAPI 記述で Security Requirement Objects を使用する例については、付録 G: 解析と解決のガイダンス 内の Implicit Connection Resolution Examples も参照してください。
api_key: []
この例では Security Scheme にコンポーネント名を使用しています。
petstore_auth:
- write:pets
- read:pets
この例では Security Scheme に相対 URI 参照を使用しています。
OpenAPI Object または Operation Object に定義されるようなオプションの OAuth2 セキュリティ例:
security:
- {}
- petstore_auth:
- write:pets
- read:pets
OpenAPI Specification はほとんどのユースケースに対応するように設計されていますが、特定の箇所で仕様を拡張するために追加データを付加することができます。
拡張プロパティは常に x- でプレフィックスされたパターン化フィールドとして実装されます。
| Field Pattern | Type | Description |
|---|---|---|
| ^x- | Any | OpenAPI スキーマへの拡張を許可します。フィールド名は MUST で x- で始まる必要があります(例:
x-internal-id)。x-oai- および x-oas- で始まるフィールド名は OpenAPI Initiative によって定義された用途のために予約されています。値は任意の有効な
JSON 値(null、プリミティブ、配列、もしくはオブジェクト)になり得ます。
|
OpenAPI Initiative はいくつかの extension registries を維持しており、個別の拡張キーワードや拡張キーワードの名前空間のためのレジストリも含まれます(例: individual extension keywords, extension keyword namespaces)。
拡張は仕様への追加提案の実現可能性を示す最良の方法の一つです。したがって、コミュニティの実験をサポートするために、実装は拡張性を念頭に設計することが RECOMMENDED です。
任意の拡張をサポートすることは OPTIONAL であり、ある拡張をサポートしているからといって他の拡張をサポートすることを意味するわけではありません。
OpenAPI Description は JSON、YAML、および JSON Schema の組み合わせを使用しており、それに伴うセキュリティ上の考慮事項を共有します:
さらに、OpenAPI Description はクライアントコード生成、ドキュメント生成、サーバ側のルーティング、API テストなど多目的のために多種多様なツールによって処理されます。OpenAPI Description の作成者は OpenAPI Description が使用され得るシナリオにおけるリスクを考慮しなければなりません。
OpenAPI Description は定義するリソースを保護するために使用されるセキュリティスキームを記述します。利用可能なセキュリティスキームは保護の度合いが異なります。データの機微性やセキュリティ侵害の潜在的影響などの要因が、API リソースに適用するセキュリティスキームの選択を導くべきです。既存の API との互換性のために basic auth や OAuth Implicit フローのようなスキームがサポートされることがありますが、OpenAPI にそれらが含まれていることは、それらの使用を推奨するものではありません。特に機微なデータや操作に対しては注意が必要です。
Security Requirement Object を Components Object 配下の Security Scheme Object に接続するルールには悪用され得る曖昧さがあります。具体的には:
OpenAPI Specification のいくつかのオブジェクトは宣言されても空のままにできたり、完全に削除され得ますが、それらは本来 API ドキュメントの中核を成すものです。
これはドキュメントに対する追加的なアクセス制御の層を許すための理由です。仕様自体の一部ではありませんが、特定のライブラリは認証/認可の形態に基づいてドキュメントの一部へのアクセスを制限することを選択することが MAY あります。
これの二つの例:
OpenAPI Description は、自動的にデリファレンスされる可能性のある外部リソースへの参照を含むことがあります。外部リソースは信頼できない別ドメインにホストされている場合があります。
OpenAPI Description 内の参照は循環を引き起こす場合があります。ツールはリソース枯渇を防ぐために循環を検出し、適切に処理しなければなりません。
特定のフィールドは Markdown の使用を許可しており、Markdown 内にはスクリプトを含む HTML が含まれる可能性があります。Markdown を適切にサニタイズするのはツールの責任です。
| Version | Date | Notes |
|---|---|---|
| 3.2.0 | 2025-09-19 | Release of the OpenAPI Specification 3.2.0 |
| 3.1.2 | 2025-09-19 | Patch release of the OpenAPI Specification 3.1.2 |
| 3.1.1 | 2024-10-24 | Patch release of the OpenAPI Specification 3.1.1 |
| 3.1.0 | 2021-02-15 | Release of the OpenAPI Specification 3.1.0 |
| 3.1.0-rc1 | 2020-10-08 | rc1 of the 3.1 specification |
| 3.1.0-rc0 | 2020-06-18 | rc0 of the 3.1 specification |
| 3.0.4 | 2024-10-24 | Patch release of the OpenAPI Specification 3.0.4 |
| 3.0.3 | 2020-02-20 | Patch release of the OpenAPI Specification 3.0.3 |
| 3.0.2 | 2018-10-08 | Patch release of the OpenAPI Specification 3.0.2 |
| 3.0.1 | 2017-12-06 | Patch release of the OpenAPI Specification 3.0.1 |
| 3.0.0 | 2017-07-26 | Release of the OpenAPI Specification 3.0.0 |
| 3.0.0-rc2 | 2017-06-16 | rc2 of the 3.0 specification |
| 3.0.0-rc1 | 2017-04-27 | rc1 of the 3.0 specification |
| 3.0.0-rc0 | 2017-02-28 | Implementer’s Draft of the 3.0 specification |
| 2.0 | 2015-12-31 | Donation of Swagger 2.0 to the OpenAPI Initiative |
| 2.0 | 2014-09-08 | Release of Swagger 2.0 |
| 1.2 | 2014-03-14 | Initial release of the formal document. |
| 1.1 | 2012-08-22 | Release of Swagger 1.1 |
| 1.0 | 2011-08-10 | First release of the Swagger Specification |
型付きデータをプレーンテキストにシリアライズすることは、text/plain メッセージボディや multipart のパート、または URL
クエリ文字列やメッセージボディ中の application/x-www-form-urlencoded
フォーマットで発生し得ますが、これは実装またはアプリケーションによって大きく定義が異なります。
Schema Objects は JSON Schema data
model に基づいてデータを検証します。JSON Schema は文字列(ただし UTF-8 としてのみ広く相互運用可能
とされる)、数値、ブール、null の四つのプリミティブ型のみを認識します。特に整数は他の数値と区別される独立した型ではなく、type: "integer"
は数学的に定義された便宜上のものです。
Parameter Object、Header Object、および Encoding Object は、配列やオブジェクト型の値をどのように配置するかを制御する機能を提供します。また、文字列を不正または予約文字から避けるためにさらにエンコードする方法を制御するためにも使用できます。しかし、スキーマ検証済みの非 UTF-8 プリミティブ型(または配列やオブジェクト全体)を文字列に変換するための汎用仕様は存在しません。
ただし二つのケースは標準に基づいた指針を提供します:
null
を含む値が undefined と見なされ展開過程で特別扱いされることを指定します。RFC6570 の実装はしばしば非文字列値の変換に独自の慣習を持ちますが、これは実装依存であり RFC 自体で定義されるものではありません。これが OpenAPI がこれらの変換を実装定義のままにしている理由の一つです:RFC6570 実装をそのまま使えるようにするためです。
数値、ブール、null(または RFC6570 が undefined と見なすその他の値)のシリアライズをより正確に制御するには、スキーマを
type: "string" として定義し、pattern、enum、format
などのキーワードでアプリケーションがスキーマ検証の前にデータをどのように事前変換すべきかを伝えることができます。結果として得られる文字列はそれ以上の型変換を必要としません。
format キーワードはシリアライズに役立ちます。いくつかのフォーマット(例:date-time)は曖昧さがありませんが、decimal
のように明確でないものもあります。ただし、特定のフォーマットがすべての関連ツールでサポートされているか注意する必要があります。未認識のフォーマットは無視されます。
入力を事前フォーマットされた、スキーマ検証済みの文字列として要求することは、すべてのプログラミング言語や環境が同じデータ型をサポートしているわけではないため、ラウンドトリップの相互運用性を向上させます。
シリアライズは三つのシナリオで [RFC6570] の URI Template に基づいて定義されます:
| Object | Condition |
|---|---|
| Parameter Object | When schema is present |
| Header Object | When schema is present |
| Encoding Object | When encoding for application/x-www-form-urlencoded and any of style,
explode, or allowReserved are used
|
この仕様の実装は RFC6570 の実装を使用して変数展開を行っても MAY ですが、いくつか注意点があります。
style: "form" の RFC6570 展開を使用して application/x-www-form-urlencoded の HTTP
メッセージボディを生成する場合、URI クエリ文字列構文を満たすために生成される先頭の ? プレフィックスを削除する必要があります。
style 等のキーワードを使用して multipart/form-data ボディを生成する場合、クエリ文字列名は
Content-Disposition のパートヘッダの name パラメータに置かれ、値は対応するパートボディに置かれます;その際
?、=、および & 文字は使用されず、URI
パーセントエンコーディングは適用されません(allowReserved の値にかかわらず)。RFC7578 はファイル名に対しては RFC3986
によるパーセントエンコーディングを許容しますが、それ以外の部分に関しては扱っていません。ユーザは RFC7578 に適合するように必要なエスケープを事前に適用して名前とデータを提供することが期待されます。
すべての RFC6570 実装が OpenAPI で必要な四つのレベルのオペレータをサポートするわけではない点にも注意してください。サポートレベルの低い実装を使う場合は制限を回避するために手動で URI Template を構築する必要があります。
特定のフィールド値は RFC6570 の operators に対応(または非対応)します:
| field | value | equivalent |
|---|---|---|
| style | "simple" |
n/a |
| style | "matrix" |
; prefix operator |
| style | "label" |
. prefix operator |
| style | "form" |
? prefix operator |
| allowReserved | false |
n/a |
| allowReserved | true |
+ prefix operator |
| explode | false |
n/a |
| explode | true |
* modifier suffix |
複数の style: "form" パラメータは RFC6570 の ? プレフィックス演算子を用いる単一の変数リストと同等です:
parameters:
- name: foo
in: query
schema:
type: object
explode: true
- name: bar
in: query
schema:
type: string
この例は RFC6570 の {?foo*,bar} に相当し、強調すべきは NOT {?foo*}{&bar}
である点です。後者は問題があり、もし foo が未定義なら無効な URI になります。& プレフィックス演算子は Parameter Object
に対応するものがありません。
RFC6570 は explode
によって扱われる単一レベルを超える複合値の振る舞いを定めていないため、オブジェクトや配列を用いた場合に明確な振る舞いが指定されていないケースの結果は実装依存です。
配列やオブジェクト値を結合するために style: "simple" で使われる , のような RFC6570
展開で使用される区切り文字は、allowReserved が false の間は自動的にパーセントエンコードされます。RFC6570 は URI
テンプレートに基づく変数を解析する方法を定めないため、ユーザはまず区切り文字で分割してから区切り文字を含む可能性のある値をパーセントデコードする前に分割を行う必要があります。
allowReserved が true
の場合、パーセントエンコード(区切りで結合する前)とパーセントデコード(区切りで分割した後)は適切なタイミングで手動で行う必要があります。
Appendix E は、区切り文字が含まれる
style 値の取り扱いに関する追加ガイダンスを提供します。
直接的な [RFC6570] に対応しない構成は RFC6570 に従って処理することが SHOULD です。実装は個々の名前や値のために RFC6570 の通常または予約展開(allowReserved
に基づく)を使って適切に区切られた URI Template を作成することを MAY します。
これには次が含まれます:
pipeDelimited、spaceDelimited、deepObject のスタイルform スタイルと allowReserved: true の組み合わせ(同時に一つのプレフィックス演算子しか使えないため許されない)Parameter Object の name フィールドは RFC6570 の variable name syntax
よりもはるかに許容範囲が広いです。RFC6570 変数文字セット外の文字を含むパラメータ名は、URI Template で使用する前にパーセントエンコードされなければなりません(MUST)。
例えば、次のデータをフォームクエリ文字列で使いたいとします。ここで formulas は exploded され、words はされないものとします:
formulas:
a: x+y
b: x/y
c: x^y
words:
- math
- is
- fun
この Parameter Object の配列は通常の style: "form" 展開を使用しており、[RFC6570]
によって完全にサポートされます:
parameters:
- name: formulas
in: query
schema:
type: object
additionalProperties:
type: string
explode: true
- name: words
in: query
schema:
type: array
items:
type: string
これは次の URI Template に変換されます:
{?formulas*,words}
先に示したデータで展開すると次のようになります:
?a=x%2By&b=x%2Fy&c=x%5Ey&words=math,is,fun
ここで(何らかの理由で)b の式内の / をクエリ文字列にそのまま現れるようにしたく、words
を書き言葉のようにスペース区切りにしたいとします。そのために formulas に allowReserved: true
を追加し、words に対して style: "spaceDelimited" に変更します:
parameters:
- name: formulas
in: query
schema:
type: object
additionalProperties:
type: string
explode: true
allowReserved: true
- name: words
in: query
style: spaceDelimited
explode: false
schema:
type: array
items:
type: string
? と + の RFC6570 プレフィックスは組み合わせられず、区切り文字の , をスペースに置き換える方法も
RFC6570 にはありません。したがって、手動で組み立てた URI Template に合わせてデータを再構成する必要があります。
ここでは一つの手法として、words.0、words.1、words.2 のような慣習を用いるテンプレートを示します:
?a={+a}&b={+b}&c={+c}&words={words.0} {words.1} {words.2}
RFC6570 は . をサブ構造の名前階層を示すために用いることを言及していますが、特定の命名規約や振る舞いは定義していません。したがって、この .
の使用は自動的ではなく、上記テンプレートに合わせた入力構造を構築する必要があります。
さらに、formulas の値は []#&=+ を事前にパーセントエンコードしておく必要があるかもしれません(この例では主に
+ が出現しますが)。
a: x%2By
b: x/y
c: x^y
words.0: math
words.1: is
words.2: fun
この手動で組み立てたテンプレートを上記データで展開すると次のクエリ文字列が得られます:
?a=x%2By&b=x/y&c=x%5Ey&words=math%20is%20fun
この結果では / と事前パーセントエンコードされた %2B はそのまま残り、値中の許可されない ^
はパーセントエンコードされ、テンプレート中のスペースは %20 にエンコードされています。
手動でテンプレートを構築する際には、RFC6570 が undefined と扱う値 を正しく扱うよう注意が必要です:
formulas: {}
words:
- hello
- world
このデータを元の RFC6570 互換テンプレート {?formulas*,words} で展開すると次のようになります:
?words=hello,world
つまり、手動で作成したテンプレートと再構成したデータは formulas オブジェクトを完全に除外して、words
パラメータが最初で唯一のパラメータになるようにする必要があります。
再構成したデータ:
words.0: hello
words.1: world
手動で構築した URI Template:
?words={words.0} {words.1}
結果:
?words=hello%20world
この例では、ハートの絵文字は URI Template 名(もしくは URI)として合法ではありません:
parameters:
- name: ❤️
in: query
schema:
type: string
単に ❤️: "love!" を RFC6570 実装に渡すことはできません。代わりに名前(6 バイトの UTF-8 シーケンス)をデータと URI Template
の両方で事前にパーセントエンコードする必要があります:
"%E2%9D%A4%EF%B8%8F": love!
{?%E2%9D%A4%EF%B8%8F}
これは次のように展開されます:
?%E2%9D%A4%EF%B8%8F=love%21
HTTP ヘッダは許容される文字や、許されない文字をどのようにエスケープして含めるかについて一貫性のない規則を持っています。quoted-string の ABNF ルール([RFC9110] の Section
5.4.6)は最も一般的なエスケープ方法ですが、普遍的に自動適用できるほど一般的ではありません。例えば、強い ETag は
"foo"(引用符を含む)で、弱い ETag は W/"foo" のように見えます;この場合引用符内の内容も
quoted-string の内容とは異なる扱いです。
このため、Parameter や Header オブジェクト経由でヘッダに渡されるデータは、OAS 実装に渡す前に引用符で囲みエスケープしておく必要があり、解析されたヘッダ値は引用符およびエスケープを含むことが期待されます。
注意: 本節では可読性のために application/x-www-form-urlencoded と
multipart/form-data のメディアタイプをそれぞれ form-urlencoded および
form-data と略記します。
パーセントエンコーディングは URI および URI から文法を派生させたメディアタイプで使用されます。 パーセントエンコーディングの基本的なルールは次のとおりです:
+ 文字のデコード方法は、application/x-www-form-urlencoded の規則を使うか、より一般的な URI
規則を使うかによって異なります;これはデコードアルゴリズムの選択が結果を変える唯一のケースです。この付録の残りは上記のルールに基づく詳細なガイダンスを提供します。
この処理は三つの文字クラスに関係しており、仕様によって呼び方は異なりますが、本節の目的のために次のように定義します:
form-urlencoded は
=、&、および + に特別な振る舞いを定義します)。
特に指定がない限り、本節では RFC3986 の reserved と unreserved の定義を使用し、unsafe セットはそれら両方に含まれないすべての文字として定義します。
各 URI
コンポーネント(クエリ文字列など)は、いくつかの予約文字を安全ではないものと見なします。これはそれらがコンポーネント間のデリミタとして機能するため(例:#)、または([
と ] の場合のように)歴史的にグローバルに安全でないと見なされ後に限定的な目的で予約されたためです。
コンポーネント内で特別な意味が定義されていない予約文字は未エンコードのまま残すことができます。しかし、他の仕様が特別な意味を定義することがあり、その場合は追加の特別な意味の外側ではその文字をパーセントエンコードすることが求められます。
form-urlencoded メディアタイプは区切り記号としての = と &、および空白の代替としての
+(%20 の代わり)に対して特別な意味を定義します。
これは、これら三つの文字が RFC3986 によってクエリ文字列で予約されつつ許可されている一方で、form-urlencoded のクエリ文字列ではそれらが
form-urlencoded の用途で使われる場合を除きパーセントエンコードされなければならないことを意味します;付録 C を参照してください。
[RFC7578] の Section 2
は、ファイル名などのパートヘッダに含まれるテキストベースのデータを ASCII 文字集合に収める手段として RFC3986 に基づくパーセントエンコーディングを提案しています。
この提案は 2015 年以前の(古い)form-data に関する仕様の一部ではなかったため、相互運用性を確保するために注意が必要です。
パーセントエンコーディングをこの方法で使用したい場合、ユーザはデータを事前にパーセントエンコードした形で提供することを MUST
します。なぜなら、このメディアタイプではどの Encoding Object フィールドが使われても自動的にパーセントエンコーディングが適用されることはないからです。
form-data メディアタイプはそのパートに任意のテキストまたはバイナリデータを許容するため、一般にはパーセントエンコーディングや類似のエスケープは必要ありません。
URI のパーセントエンコーディングと form-urlencoded
メディアタイプは、複数の改訂にまたがる複雑な仕様履歴を持ち、場合によっては異なる標準化団体が所有権を主張する矛盾した主張を含みます。
残念ながら、これらの仕様はそれぞれわずかに異なるパーセントエンコーディング規則を定義しており、URI や form-urlencoded
のメッセージ本文が厳密な検証の対象になる場合はそれらを考慮する必要があります。
(多くの URI パーサはデフォルトで検証を行わないことに注意してください。)
本仕様は以下の関連標準を規範的に引用します:
| Specification | Date | OAS Usage | Percent-Encoding | Notes |
|---|---|---|---|---|
| [RFC3986] | 01/2005 | URI/URL 構文、form-urlencoded ではないコンテンツベースのシリアライズを含む |
[RFC3986] | 以前の RFC1738, RFC2396 を廃止 |
| [RFC6570] | 03/2012 | style ベースのシリアライズ | [RFC3986] | + をクエリ文字列に使用しない |
| WHATWG-URL Section 5 | “living” standard | コンテンツベースの form/url-encoded シリアライズ(HTTP メッセージ含む) |
WHATWG-URL Section 1.3 | RFC1866, HTML401 を廃止 |
パーセントエンコーディングを伴う style ベースのシリアライズは、Parameter Object で schema
が存在する場合、また Encoding Object で style, explode,
または allowReserved のいずれかが存在する場合に使用されます。
付録 C を参照すると、RFC6570 の 2
種類のパーセントエンコーディングアプローチや + に関する例の詳細が得られます。
コンテンツベースのシリアライズは Media Type Object によって定義され、Parameter Object と Header Object で
content フィールドが存在する場合に使用され、また Encoding Object では
contentType フィールドに基づいて style, explode, allowReserved
が存在しない場合に使用されます。
URI で使用する場合、各部分はメディアタイプ(例:text/plain や application/json)に基づいてエンコードされ、その後
form-urlencoded 文字列やその他の URL コンポーネントでの一般的な URI 使用のためにパーセントエンコードされなければなりません(メディアタイプが既に URI
パーセントエンコーディングを取り込んでいる場合を除く)。
この仕様の以前のバージョンは RFC1866 とその RFC1738
に基づくパーセントエンコーディング規則を要求していました。
WHATWG-URL の form-urlencoded 規則はこのメディアタイプに関する現在のブラウザ間での合意を表し、RFC1866 における RFC1738
の不明瞭な言い換えが導入したあいまいさを回避します。
RFC1866/RFC1738 との整合性が必要なユーザは、自身のツールやライブラリの挙動を注意深く確認することを推奨します。
WHATWG はブラウザ志向の標準化グループであり、ブラウザコンテキストでの URL の解析とシリアライズのための“URL Living Standard” を定義しています。これには
form-urlencoded データの解析とシリアライズも含まれます。
WHATWG のクエリ文字列に対するパーセントエンコーディング規則は、そのクエリ文字列が form-urlencoded
として扱われるか(より多くのパーセントエンコーディングを要求する)汎用構文の一部として扱われるかで異なります。
本仕様は form-urlencoded 仕様として WHATWG にのみ依存します。クエリ文字列を他の方法で使用する実装は、WHATWG の非
form-urlencoded のクエリ文字列規則と RFC3986 の違いを慎重に検討し、WHATWG のパーセントエンコード集合と URL の有効な Unicode
コードポイント集合の両方を取り入れる必要があります;詳しくは Percent-Encoding and Illegal or
Reserved Delimiters を参照してください。
パーセントデコードアルゴリズムは、どの文字がパーセントデコードされたかに依存しないため、任意の仕様に従ってパーセントエンコードされた URI は正しくデコードされます。
同様に、すべての form-urlencoded デコードアルゴリズムはパーセントデコードアルゴリズムに対して +
を空白に扱う処理を加えたものに過ぎず、エンコード仕様に依らず動作します。
しかしながら、+ が空白を表す場合は form-urlencoded デコードを使用し、+
がリテラルのプラス記号を表す場合は通常のパーセントデコードを使用するなど、適切なデコードを用いることに注意が必要です。
[, ], | および空白文字は、それぞれ
deepObject、pipeDelimited、および spaceDelimited
スタイルの区切り文字として使用されますが、これらはいずれも RFC3986 に準拠するために MUST パーセントエンコードされなければなりません。
これにより、これらのスタイルを使用する際にはパラメータ名や値において区切り用途と区別するために事前に文字を別の方法でエンコードしておく必要があります。
空白文字は常に違法であり、関連するすべての標準の実装によって何らかの方法でエンコードされます。
パラメータ名や値の空白を spaceDelimited の区切り(%20)と区別するために
+(form-urlencoded
の慣例)を使うこともできますが、仕様はデコードを一回のパスとして定義しているため、非標準の解析アルゴリズムを用いない限りデコード後の結果から用途の違いを区別することはできません。
そのような非標準の解析方法はすべてのツール間で相互運用可能ではありません。
一部の環境では [, ], そして場合によっては |
をクエリ文字列で未エンコードのまま使用しても問題がないように見えることがあります。
WHATWG の汎用クエリ文字列規則は非 form-urlencoded のクエリ文字列ではこれらの文字のパーセントエンコードを要求しませんが、有効な URL の Unicode
コードポイントの集合からはそれらを除外しています。
これらの区切り文字を未エンコードのままにしつつ名前と値の内部では通常のパーセントエンコーディングを使用するコードは、すべての実装間で相互運用可能であるとは保証されません。
最大の相互運用性を得るためには、これらのスタイルを使用する際に区切り文字をパーセントエンコードすると同時に追加のエスケープ規約を定義して文書化するか、あるいはこれらのスタイル自体を避けることが RECOMMENDED です。 追加のエンコード/エスケープの正確な方法は API 設計者に委ねられており、本仕様の記述するシリアライズとエンコーディングの手順の前に実行され、逆手順で元に戻されることが期待されます。これにより、その処理は本仕様で管理されるプロセスの外に置かれます。
本節は四つの可能な基底 URI の各々の出所を示し、その後に相対の $self と $id を含む例を示します。
リソースのコンテンツ内の基底 URI([RFC3986] の Section 5.1.1)は、基底 URI
の最も高い優先度の出所です。
OpenAPI ドキュメントの場合、この出所は OpenAPI Object の $self フィールドであり、Schema Object が $id
を含む場合、または $id を含むスキーマのサブスキーマである場合はその $id フィールドが出所となります:
次のドキュメントの取得 URI を file://home/someone/src/api/openapi.yaml と仮定します:
openapi: 3.2.0
$self: https://example.com/api/openapi
info:
title: Example API
version: 1.0
paths:
/foo:
get:
requestBody:
$ref: "shared/foo#/components/requestBodies/Foo"
次のドキュメントの取得 URI を https://git.example.com/shared/blob/main/shared/foo.yaml と仮定します:
openapi: 3.2.0
$self: https://example.com/api/shared/foo
info:
title: Shared components for all APIs
version: 1.0
components:
requestBodies:
Foo:
content:
application/json:
schema:
$ref: ../schemas/foo
schemas:
Foo:
$id: https://example.com/api/schemas/foo
properties:
bar:
$ref: bar
Bar:
$id: https://example.com/api/schemas/bar
type: string
この例では、両方のドキュメントが $self を定義しているため、取得 URI は無関係です。
最初のドキュメントの相対 $ref は $self に対して解決され、
https://example.com/api/shared/foo#/components/requestBodies/Foo を生成します。
その URI の # より前の部分は第二のドキュメントの $self と一致するため、参照先はその第二のドキュメントの
#/components/requestBodies/Foo に解決されます。
そのドキュメント内で、Request Body Object の $ref はそのドキュメントの $self を基底 URI
として解決され、https://example.com/api/schemas/foo を生成します。
これは #/components/schemas/Foo/$id の $id と一致するのでその Schema Object を指します。
その Schema Object はサブスキーマに $ref: bar を持ち、これは $id に対して解決されて
https://example.com/api/schemas/bar となり、#/components/schemas/Bar/$id の
$id と一致します。
相互運用性を保証するために、$id を含む Schema Object、または $id を含むスキーマの下にある Schema Object
は、参照の非フラグメント部分に対して最も近いそのような $id によって参照されなければなりません(MUST)。
JSON Schema 仕様が指摘するように、最も近い $id 以外の基底 URI を使用し、その $id を JSON Pointer
フラグメントで横断することは互換性がありません。
また、#/components/schemas/Foo/properties/bar/$ref の参照が 単に JSON Pointer フラグメントだけで
#/components/schemas/Bar のスキーマを参照することは不可能である点にも注意してください。JSON Pointer は
https://example.com/api/schemas/foo に対して解決され、OpenAPI ドキュメントの基底
URI($self)に対してではないためです。
コンテンツ内で基底 URI を決定できない場合、次に探索すべき場所はカプセル化エンティティです([RFC3986] の Section 5.1.2)。
これは OpenAPI ドキュメント内にカプセル化されている Schema Object に一般的です。
OpenAPI Object 自体が別のエンティティにカプセル化される例は multipart/related アーカイブ([RFC2557)のようなもので、例えば
multipart/related; boundary="boundary-example"; type="application/openapi+yaml"
のようなドキュメントが考えられます。これは純粋に例示的なものであり、そのような multipart ドキュメントや OpenAPI Object
をカプセル化するその他の形式のサポートは本仕様の要件ではありません。
RFC2557 はハイパーリンクされたドキュメント群をメール添付として送ることを可能にするために書かれており、その場合マルチパート添付の取得 URI は存在しないでしょう(とはいえこの形式は HTTP でも使えます)。
--boundary-example
Content-Type: application/openapi+yaml
Content-Location: https://example.com/api/openapi.yaml
openapi: 3.2.0
info:
title: Example API
version: 1.0
externalDocs:
url: docs.html
components:
requestBodies:
Foo:
content:
application/json:
schema:
$ref: "#/components/api/schemas/Foo"
schemas:
Foo:
properties:
bar:
$ref: schemas/bar
--boundary-example
Content-Type: application/schema+json
Content-Location: https://example.com/api/schemas/bar
{
"type": "string"
}
--boundary-example
Content-Type: text/html
Content-Location: https://example.com/api/docs.html
<html>
<head>
<title>API Documentation</title>
</head>
<body>
<p>Awesome documentation goes here</p>
</body>
</html>
--boundary-example
この例では、各パートの URI(基底 URI としても機能)は RFC2557 に従ってパートの Content-Location ヘッダから取得されます。
#/components/schemas/Foo の Schema Object が $id を含まないため、そのサブスキーマ内の参照は OpenAPI
ドキュメントの基底 URI を使用し、これは multipart/related 形式におけるそのパートの Content-Location
ヘッダから取られます。
結果として得られる https://example.com/schemas/bar は第二のパートの Content-Location
ヘッダと一致し、RFC2557 に従って参照先をマルチパートアーカイブ内で見つけることを可能にします。
同様に、External Documentation Object の url フィールドは
Content-Location の基底 URI に対して解決され、https://example.com/api/docs.html
を生成し、これは第三のパートの Content-Location と一致します。
前のどちらの出所からも基底 URI が提供されない場合、次に参照すべきは取得 URI です([RFC3986] の Section 5.1.3)。
このドキュメントが https://example.com/api/openapis.yaml から取得されたと仮定します:
openapi: 3.2.0
info:
title: Example API
version: 1.0
components:
requestBodies:
Foo:
content:
application/json:
schema:
$ref: schemas/foo
このドキュメントが https://example.com/api/schemas/foo から取得されたと仮定します:
{
"type": "object",
"properties": {
"bar": {
"type": "string"
}
}
}
OpenAPI ドキュメントの取得 URI に対して $ref: schemas/foo を解決すると
https://example.com/api/schemas/foo になり、これは JSON Schema ドキュメントの取得 URI になります。
$self やカプセル化エンティティ、取得 URI を持たないメモリ内の OpenAPI ドキュメントを構築する場合、アプリケーションは断片のみの内部参照を解決するためにデフォルト基底
URI を仮定することができます([RFC3986] の Section 5.1.4)。
このような内部解決は実際には基底 URI を選ばずに行うことも可能ですが、ランダムに生成された UUID を含む
URN(例:urn:uuid:f26cdaad-3193-4398-a838-4ecb7326c4c5)のような基底 URI を選ぶと特別扱いとして実装する必要がなくなります。
本付録の最初の例を再検討しますが、今回は $self と $id に相対 URI 参照を用い、相対使用をサポートする取得 URI を持つとします:
次の内容が https://staging.example.com/api/openapi から取得されたと仮定します:
openapi: 3.2.0
$self: /api/openapi
info:
title: Example API
version: 1.0
paths:
/foo:
get:
requestBody:
$ref: "shared/foo#/components/requestBodies/Foo"
次のドキュメントの取得 URI を https://staging.example.com/api/shared/foo と仮定します:
openapi: 3.2.0
$self: /api/shared/foo
info:
title: Shared components for all APIs
version: 1.0
components:
requestBodies:
Foo:
content:
application/json:
schema:
$ref: ../schemas/foo
schemas:
Foo:
$id: /api/schemas/foo
properties:
bar:
$ref: bar
Bar:
$id: /api/schemas/bar
type: string
この例では、すべての $self と $id の値は絶対パスからなる相対 URI 参照です。
これにより取得 URI がホスト(およびスキーム)を設定でき、ここでは https://staging.example.com となり、最初のドキュメントの
$self は https://staging.example.com/openapi、第二のドキュメントの $self は
https://staging.example.com/api/shared/foo になり、$id 値は
https://staging.example.com/api/schemas/foo および
https://staging.example.com/api/schemas/bar となります。
この種の相対 $self と $id により、同じドキュメント群は他のホスト(例:https://example.com(本番)や
https://localhost:8080(ローカル開発))でも動作します。
実装は全文ドキュメントの解析を次のいずれかの方法でサポートしてもよい(MAY):
openapi フィールドを通じて OpenAPI ドキュメントを検出するルートが OpenAPI Object や Schema Object 以外のオブジェクトであるドキュメントをサポートするために追加のメカニズムを使用することもできますが、その結果の振る舞いは実装依存であることに注意してください:
参照された OpenAPI コンテンツの断片を含む部分だけを、その含むドキュメントの残りの内容を考慮せずに解析する実装は、参照対象の意味や振る舞いを変えるキーワードを見落とすことになります。特に、基底 URI を変えるキーワードを考慮しないと参照が意図しない URI に解決され、予測不能な結果をもたらすことでセキュリティリスクを招きます。 過去バージョンの要件のためにこの種の解析をサポートする実装がある一方で、バージョン 3.1 以降では、断片を単独で解析した結果は 未定義 であり、本仕様の要件と矛盾する可能性が高いことに注意してください。
参照断片のみを解析した場合に正しく動作するように OpenAPI 記述を構成することは可能ですが、それに依存することは RECOMMENDED されません。本仕様はそのような振る舞いが安全である条件を明示的に列挙せず、将来のバージョンでの継続的な安全性を保証しません。
OAD 内の JSON または YAML オブジェクトは、そのコンテキストに基づいて特定のオブジェクト(Operation Objects, Response Objects, Reference Objects など)として解釈されます。参照の配置方法によっては、ある JSON/YAML オブジェクトが複数の異なる文脈で解釈され得ます:
同じ JSON/YAML オブジェクトが複数回解析され、各文脈がそれを 異なる
オブジェクト型として解析することを要求する場合、その結果の振る舞いは実装依存であり、検出されればエラー扱いとすることが MAY あります。
例としては、Path Item Object が期待される場所に #/components/schemas の下の空の Schema Object
を参照する場合があり、空のオブジェクトは両方の型に対して有効です。最大の相互運用性のために、OpenAPI 記述の作成者はそのようなシナリオを避けることが RECOMMENDED です。
次のオブジェクトとフィールドは暗黙的接続の使用を含みます:
| Source | Target | Alternative |
|---|---|---|
Security Requirement Object {name}
|
Security Scheme Object name under the Components Object | n/a |
Discriminator Object mapping (implicit,
or explicit name syntax) |
Schema Object name under the Components Object | mapping (explicit URI syntax) |
Operation Object tags |
Tag Object name (in the OpenAPI Object’s tags array) |
n/a |
Link Object operationId |
Operation Object operationId |
operationRef |
Paths Object のテンプレート化された URL パスを適切な Server Object の url フィールドに付加するという追加の暗黙的接続があります。
この接続は、エントリドキュメントの Paths Object のみが記述される API に URL を寄与するため、あいまいさがありません。
Security Requirement Object と Discriminator Object の暗黙的接続は コンポーネント名 に依存します。これは Components Object
の適切な型のサブオブジェクト内でコンポーネントを保持するプロパティの名前です。
例として、#/components/schemas/Foo にある Schema Object のコンポーネント名は Foo です。
Operation Object の tags の暗黙的接続は Tag Object の name フィールドを使用します。これらは(Components
Object と同様に)ルートの OpenAPI Object の下にあります。
したがって、コンポーネント名とタグ名の解決は正しい OpenAPI Object から開始することに依存します。
参照(非エントリ)ドキュメントからコンポーネントおよびタグ名の接続を解決する際は、ツールはエントリドキュメントから解決することを RECOMMENDED します。これは Resolving Implicit Connections で推奨されている方法であり、コンポーネントと Tag Objects をサーバオブジェクトのトップレベル配列の近くに定義して参照ドキュメントがそれらにアクセスできるようにするインターフェースとして扱えます。
Security Requirement Objects と Discriminator Objects に関しては、これらのオブジェクトが提供する URI 参照形式を使用して、解決を参照ドキュメント内に留めることも可能です。
Operation Object の tags フィールドには URI ベースの代替手段はありません。OAD 作成者は複数のドキュメント間で Tag Objects を共有するために OpenAPI Initiative の Overlay Specification
のような外部ソリューションの使用を検討することが推奨されます。
本節は HTTP でアクセス可能なマルチドキュメントの OpenAPI Description (OAD) を取得し、参照ドキュメント(非エントリ)内の Security Requirement Object を解決する方法を示します。
Discriminator Object の非 URI マッピングや Operation Object の tags フィールドについても同じ原則で動作します。
まずエントリドキュメントから解析が始まります。そこでは MySecurity セキュリティスキームを JWT ベースとして定義し、ある Path Item
を別のドキュメントのコンポーネントへの参照として定義しています:
GET /api/description/openapi HTTP/1.1
Host: www.example.com
Accept: application/openapi+json
"components": {
"securitySchemes": {
"MySecurity": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT"
}
}
},
"paths": {
"/foo": {
"$ref": "other#/components/pathItems/Foo"
}
}
GET /api/description/openapi HTTP/1.1
Host: www.example.com
Accept: application/openapi+yaml
components:
securitySchemes:
MySecurity:
type: http
scheme: bearer
bearerFormat: JWT
paths:
/foo:
$ref: 'other#/components/pathItems/Foo'
このエントリドキュメントは別のドキュメント other
を拡張子なしで参照しています。これはクライアントに資源ごとに受け入れ可能な形式を選択する柔軟性を与えます(両方の表現が利用可能であると仮定して):
GET /api/description/other HTTP/1.1
Host: www.example.com
Accept: application/openapi+json
"components": {
"securitySchemes": {
"MySecurity": {
"type": "http",
"scheme": "basic"
}
},
"pathItems": {
"Foo": {
"get": {
"security": [
"MySecurity": []
]
}
}
}
}
GET /api/description/other HTTP/1.1
Host: www.example.com
Accept: application/openapi+yaml
components:
securitySchemes:
MySecurity:
type: http
scheme: basic
pathItems:
Foo:
get:
security:
- MySecurity: []
other ドキュメントでは、参照されたパスアイテムが Security Requirement として MySecurity
を要求しています。同名の Security Scheme は元のエントリドキュメントにも存在します。Resolving Implicit Connections で述べられているように
MySecurity
の解決は実装依存の振る舞いを持ち得ますが、本節はツールがエントリドキュメントからコンポーネント名を解決することを正式に推奨しています。すべての実装依存の振る舞いと同様に、どの振る舞いがサポートされているかを判断するためにツールのドキュメントを確認することが重要です。