OpenAPI仕様 v3.2.0

バージョン 3.2.0

このドキュメントの詳細
このバージョン:
https://spec.openapis.org/oas/v3.2.0.html
最新公開バージョン:
https://spec.openapis.org/oas/latest.html
最新の編集者ドラフト:
https://github.com/OAI/OpenAPI-Specification/
編集者:
Henry Andrews
Jeremy Whitlock
Karen Etheridge
Lorna Mitchell
Marsh Gardiner
Miguel Quintero
Mike Kistler
Ralf Handl
Vincent Biret
元編集者:
Ron Ratovsky
Darrel Miller
Mike Ralphson
Uri Sarid
Jason Harmon
Tony Tam
その他のバージョン:
https://spec.openapis.org/oas/v3.1.2.html
https://spec.openapis.org/oas/v3.1.1.html
https://spec.openapis.org/oas/v3.1.0.html
https://spec.openapis.org/oas/v3.0.4.html
https://spec.openapis.org/oas/v3.0.3.html
https://spec.openapis.org/oas/v3.0.2.html
https://spec.openapis.org/oas/v3.0.1.html
https://spec.openapis.org/oas/v3.0.0.html
https://spec.openapis.org/oas/v2.0.html
参加方法
GitHub OAI/OpenAPI-Specification
バグ報告
コミット履歴
プルリクエスト

OpenAPI仕様とは何ですか?

OpenAPI仕様(OAS)は、HTTP APIの標準的なプログラミング言語非依存のインターフェース記述を定義します。これにより、人間とコンピュータの両方がソースコード、追加のドキュメント、ネットワークトラフィックの調査なしにサービスの機能を発見し理解することができます。OpenAPIで適切に定義された場合、利用者は最小限の実装ロジックでリモートサービスを理解し、やり取りすることができます。低レベルなプログラミングでインターフェース記述が果たしてきたことと同様に、OpenAPI仕様はサービス呼び出しにおける推測を排除します。

このドキュメントのステータス

この仕様の真の情報源は上記の「このバージョン」として参照されるHTMLファイルです。

1. OpenAPI仕様

1.1 バージョン3.2.0

この文書中のキーワード “MUST”(〜しなければならない)、 “MUST NOT”(〜してはならない)、 “REQUIRED”(必須)、 “SHALL”(〜するものとする)、 “SHALL NOT”(〜しないものとする)、 “SHOULD”(〜するのが望ましい)、 “SHOULD NOT”(〜しないのが望ましい)、 “RECOMMENDED”(推奨)、 “NOT RECOMMENDED”(非推奨)、 “MAY”(〜してもよい)、 “OPTIONAL”(任意)は、すべて大文字で記載されている場合に限り、BCP 14 [RFC2119] [RFC8174] に定める通りに解釈されます。

この文書は Apache License, Version 2.0 のもとでライセンスされています。

2. はじめに

OpenAPI仕様(OAS)は、HTTP APIの標準化された言語非依存のインターフェースを定義し、ソースコードやドキュメントへのアクセス、ネットワークトラフィックの検査なしで、人間とコンピュータの両方がサービスの機能を発見し理解できるようにします。適切に定義されていれば、利用者は最小限の実装ロジックで、HTTPメッセージの解析およびシリアライズを通じてリモートサービスを、データモデルとして理解し、操作することができます。

OpenAPI記述(OAD)はドキュメント生成ツールによるAPI表示や、コード生成ツールによる様々なプログラミング言語用のサーバ・クライアントの自動生成、テストツール及びその他多様なユースケースに利用できます。

OpenAPIの利用例や追加資料については、[OpenAPI-Learn] をご参照ください。

OpenAPI Initiativeが公開する仕様や拡張レジストリ、そしてこの仕様の公式レンダリングについては、spec.openapis.org をご参照ください。

2.1 バージョンと廃止予定

OpenAPI仕様のバージョンは major.minor.patch の方式で管理されます。バージョン文字列の major.minor 部分(例:3.1)がOASの機能セットを示します。.patch バージョンは、仕様ドキュメント自体へのエラー修正や明確化を表し、機能セットの変更ではありません。OAS 3.1 をサポートするツールは、全ての OAS 3.1.* バージョンと互換性があることが 望ましいです。パッチバージョンはツールによって考慮されるべきではなく、たとえば 3.1.03.1.1 の区別はしません。

一部のフィールドや機能は 廃止予定と表示されている場合があります。これらはそのまま仕様の一部ですが、可能な限り、新しいフィールドや機能で置き換えることを推奨します。

現時点では、そういった要素は次のメジャーバージョンまでOASに残る予定ですが、将来のマイナーバージョンで廃止要素の除去に関する方針が定められることもあります。

場合によっては、OASのminorバージョンで互換性のない変更が導入されることがありますが、これは利点が大きいと判断される場合に限られます。

2.2 未定義および実装定義の挙動

この仕様では、特定の状況を 未定義 または 実装定義 の挙動と見なします。

未定義とされる挙動は、少なくとも場合によっては仕様と矛盾する結果を生じる可能性があります。これは矛盾を検出することが不可能または非現実的な場合に用いられます。実装は歴史的理由、または過去バージョンでの曖昧な記述等により未定義のシナリオをサポートしてもよいですが、その挙動は多くの場合正しい結果となるとしても、それに依存することは推奨されません。なぜなら、すべてのツールや将来のバージョンで常に動作する保証がないためです。

一方 実装定義の挙動は、仕様要件に対して複数の方法が許容されている場合に、どの方法を取るかを実装者に委ねるものです。これはAPI記述の作成者が相互運用性を最大限高めるため推奨されない曖昧な要件を文書化します。未定義の挙動と異なり、すべてのツールで同じ挙動が保証されるなら、その依存は安全です。

3. フォーマット

OpenAPI仕様に準拠するOpenAPI文書自体はJSONオブジェクトであり、JSONまたはYAML形式のいずれかで表現できます。 この仕様で示される例は簡潔のため原則YAML形式です。

仕様書中のすべてのフィールド名は大文字小文字を区別します。 マップのキーとして使用されるすべてのフィールドもこれを含みますが、明示的に大文字小文字非区別と記載されている場合は除外されます。

OASのオブジェクトは、宣言名が定められている固定フィールドと、フィールド名がパターンで定義されるパターン化フィールドの2種類のフィールドを持ちます。

パターン化フィールドは含まれているオブジェクト内で一意の名前を持たなければなりません

備考: OpenAPI記述はYAMLまたはJSON形式で記載できますが、APIのリクエスト・レスポンスボディなどの内容がJSONやYAMLである必要はありません。

3.1 JSONとYAMLの互換性

YAMLとJSON間のラウンドトリップ性(相互変換)を維持するため、YAML version 1.2の利用を推奨するとともに、[RFC9512] Section 3.4で指定された追加制約にも従うことを推奨します。

以前の仕様バージョンで推奨されていた「JSON」スキーマルールセットのYAML制限は、(名称に反して)JSONで表現できない値も含むことがありました。OAD作成者はJSON非互換なYAML値に依存すべきではありません

3.2 大文字小文字の区別

OpenAPI仕様のほとんどのフィールド名・値は大文字小文字を区別するため、本ドキュメントでは区別しない名称・値がある場合は明記するよう努めています。ただし、HTTPに直接対応するフィールド名・値については、HTTPのルールに従います(この文書内で必ずしも全てに言及されているとは限りません)。

3.3 リッチテキスト書式

仕様全体で description フィールドは [CommonMark] のMarkdown記法をサポートしています。OpenAPIツールがリッチテキストを表示する場合、最低限 [CommonMark-0.27] のMarkdown構文を必ずサポートしなければなりません。セキュリティ対策のため、一部のCommonMarkまたは拡張の機能を無視することも可能です。

CommonMark 0.27を最低要件とすることで、ツール側で拡張機能を実装する余地がありますが、そのような拡張は定義上「実装定義」となり互換性は保証されません。OpenAPI記述の作成者は、そうした拡張を利用したテキストが、最低限のサポートだけを持つツールによってどのように表示されるかを考慮すべきです。

4. オブジェクトとフィールド

このセクションではOpenAPI記述フォーマットの構造について説明します。 この文書がフォーマットの唯一の標準的記述です。 JSONスキーマはspec.openapis.orgで参考情報として提供されています。 JSONスキーマがこのセクションと異なる場合、本セクションが優先されます。

以降の説明では、フィールドが明示的に必須またはMUSTSHALLで記述されていなければ、任意と見なすことができます。

4.1 OpenAPIオブジェクト

これはOpenAPI記述のルートオブジェクトです。

4.1.1 固定フィールド

必須フィールドに加え、componentspathswebhooksのうち少なくとも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など)による参照もサポート可能ですが、この挙動は相互運用性がなく、依存することは推奨されません

4.1.2 OpenAPI記述構造

OpenAPI記述OAD)はAPIの表面構造と意味を正確に記述します。 OADは単一文書でも複数文書でもよく、これらはURI参照暗黙的な接続を使って相互に繋がります。

パース挙動を明確にするため、OAD内の全文書はルートにOpenAPIオブジェクトまたはスキーマオブジェクトがなければならず、以降のセクションで述べる通り完全な文書としてパースする必要があります。

ルートが別のオブジェクトだったり、OAD内容と他の内容が混在する文書は実装定義または未定義の挙動となる場合があります(付録G 解析・解決ガイダンスを参照)。 本仕様では、特別な記述がない限りルートはOpenAPIオブジェクトまたはスキーマオブジェクトと見なします。

複数文書OADでは、最初にパースされるOpenAPIオブジェクトを含む文書がエントリ文書です。 OADのエントリ文書はopenapi.jsonまたはopenapi.yamlとすることが推奨されます。

OpenAPIオブジェクトは他のフォーマット(埋込フォーマット)内に埋め込むこともできます(OAS内のスキーマオブジェクトとしてJSON Schemaを埋め込む場合のように)。 埋込フォーマットは埋め込み内容のパース方法を定義する責任があります。埋込フォーマットに未対応なOAS実装は埋込OAS内容の正しいパースは保証されません。

4.1.2.1 文書のパース

OAD内の各文書は参照ターゲットを発見するため完全にパースしなければなりません。 この要件にはJSON Schema仕様ドラフト2020-12のパース要件も含まれますが、ベースURIについてはURIの相対参照の指定に従います。 参照ターゲットはOpenAPIオブジェクトの$selfフィールドや、スキーマオブジェクトの$id$anchor$dynamicAnchorキーワードなどのフィールドで定義されます。

実装は、OADのあらゆる文書が完全にパースされるまで、参照を未解決扱いとしてはなりません

参照解決時に対象部分だけパースした場合、その挙動は実装定義または未定義となります(詳細は断片的パースに関する注意および付録Gを参照)。

4.1.2.2 API記述のURIでの相対参照

OpenAPI記述内の参照や外部ドキュメント・ライセンスなど補足情報へのURIは識別子として解決され、本仕様でURIと呼びます(API URLとは区別)。歴史的に一部フィールドはurlと名付けられていますが、説明では「URI」用語が使われています。

文書のパースで述べた通り、いくつかのフィールドでOpenAPI文書やスキーマオブジェクトをURIに関連付けできます。そのため、参照元文書やスキーマが配置されている場所と一致しないURIを割り当てることが可能です。 これにより、ローカルファイルやセキュリティ制限・ネットワーク制約下でも同じ参照を利用できます。

特別な記載がない限り、URIフィールドはすべて[RFC3986] 4.2章の定義に従い相対参照を許容します。

4.1.2.2.1 ベースURIの確立

相対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で文書をユーザーが提供できるようにし、参照が取得したかのように解決されることを推奨します。

4.1.2.2.2 URIフラグメントの解決

URIにフラグメント識別子が含まれる場合、参照先文書のフラグメント解決メカニズムに従って解決します。参照文書がJSONまたはYAML表現の場合、フラグメント識別子は[RFC6901]に準じてJSON Pointerとして解釈されるべきです。

4.1.2.2.3 CommonMarkフィールド内の相対URI参照

CommonMarkのハイパーリンク内の相対参照は、表示時のコンテキストで解決されるため、API記述のコンテキストとは異なる場合があります。

4.1.2.3 暗黙的接続の解決

この仕様のいくつかの機能では、OpenAPI記述(OAD)内の他の部分へのURIに基づかない接続を解決する必要があります。

単一文書OADでは接続は明確ですが、複数文書OADの解決処理は本セクションの制約下で実装定義です。 場合によっては明確なURIベース代替案もあり、OAD作成者は相互運用性向上のためその代替案の利用を推奨します。

Components ObjectTag Objectの名前を参照元(非エントリ文書)から解決する際は、ツールはエントリ文書から解決することを推奨します。 operationIdOperation Objectを解決する際は、パース済み全文書のOperation Objectを考慮することが推奨です。

なお、暗黙的接続解決はURI参照の解決に影響はありません。

詳細や暗黙接続を用いるフィールド・オブジェクト一覧は付録G:解析・解決ガイダンスを参照してください。

4.2 Infoオブジェクト

このオブジェクトはAPIのメタデータを提供します。 メタデータは必要に応じてクライアントで利用可能であり、編集・ドキュメント生成ツールで表示される場合もあります

4.2.1 固定フィールド

フィールド名 説明
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自体のバージョン、記述のバージョンとは異なります)。

このオブジェクトは仕様拡張拡張できます

4.2.2 Infoオブジェクト例

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

4.3 Contactオブジェクト

公開APIの連絡先情報。

4.3.1 固定フィールド

フィールド名 説明
name string 連絡先の人物または組織を識別する名前。
url string 連絡先情報のURI。この値はMUST URI形式でなければなりません。
email string 連絡先の人物/組織のメールアドレス。この値はMUST メールアドレス形式でなければなりません。

このオブジェクトはMAYSpecification Extensionsにより拡張可能です。

4.3.2 Contactオブジェクト例

name: API Support
url: https://www.example.com/support
email: support@example.com

4.4 Licenseオブジェクト

公開APIのライセンス情報。

4.4.1 固定フィールド

フィールド名 説明
name string REQUIRED。APIに使用されるライセンス名。
identifier string APIのための[SPDX-Licenses]式。identifierフィールドはurlフィールドと相互排他的です。
url string APIに使用されるライセンスのURI。この値はMUST URI形式でなければなりません。urlフィールドはidentifierフィールドと相互排他的です。

このオブジェクトはMAYSpecification Extensionsにより拡張可能です。

4.4.2 Licenseオブジェクト例

name: Apache 2.0
identifier: Apache-2.0

4.5 Serverオブジェクト

サーバを表すオブジェクト。

4.5.1 固定フィールド

フィールド名 説明
url string REQUIRED。ターゲットホストへのURL。 このURLはサーバ変数をサポートし、文書が提供される場所に対してホスト位置が相対であることを示すために相対であることがMAYあります。クエリおよびフラグメントはこのURLの一部であってはなりません。変数置換は{braces}で名前が付けられた変数に対して行われます。
description string URLで指定されたホストを説明する任意の文字列。[CommonMark] 記法はリッチテキスト表現にMAY使用できます。
name string URLで指定されたホストを参照するための任意の一意な文字列。
variables Map[string, Server Variable Object] 変数名とその値のマップ。値はサーバのURLテンプレートでの置換に使用されます。

このオブジェクトはMAYSpecification Extensionsにより拡張可能です。

4.5.2 API URL内の相対参照

APIエンドポイントは位置としてアクセスされるものであり、本仕様ではURLsとして記述されます。

特に指定がない限り、URLであるすべてのフィールドは[RFC3986] の定義に従う相対参照をMAY許容します(Section 4.2)。

APIはOpenAPI文書とは別個のエンティティであるため、OpenAPI文書に対するRFC3986のベースURIルールは適用されません。特に指定がない限り、相対参照はServer Objectで定義されたURLをベースURLとして解決されます。これら自身が参照文書に対して相対であることもMAYあります。

4.5.2.1 APIベースURL決定例

次の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 となります。

4.5.3 Serverオブジェクト例

単一のサーバは次のように記述されます:

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

4.6 Server Variableオブジェクト

サーバの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

ここで、literalspct-encodeducschar、および iprivate の定義は [RFC6570] から採られており、literals に関する修正は Errata 6937 を組み込んでいます。

各サーバ変数はURLテンプレート内に複数回出現してはなりません

完全なリクエストURLの構築については Paths Object を参照してください。

4.6.1 固定フィールド

フィールド名 説明
enum [string] 置換オプションが限定的な集合から選ばれる場合に使用する文字列値の列挙。配列はMUST NOT 空であってはなりません。
default string REQUIRED。置換に使用するデフォルト値で、代替値が提供されない場合にSHALL送信されます。もしenumが定義されている場合、この値はenumの値に含まれていなければMUSTません。なお、この挙動はSchema Objectdefaultキーワードと異なり、受信側の動作を記述するものではなく値をデータに挿入するものです。
description string サーバ変数の任意の説明。[CommonMark] 記法はリッチテキスト表現にMAY使用できます。

このオブジェクトはMAYSpecification Extensionsにより拡張可能です。

4.7 Componentsオブジェクト

OASのさまざまな側面で再利用可能なオブジェクトの集合を保持します。 Components Object 内で定義されたすべてのオブジェクトは、Components Object の外部から明示的に参照されない限りAPIに影響を与えません。

4.7.1 固定フィールド

フィールド名 説明
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を保持するオブジェクト。

このオブジェクトはMAYSpecification Extensionsにより拡張可能です。

上で宣言されたすべての固定フィールドは、キーが正規表現 ^[a-zA-Z0-9\.\-_]+$ にマッチする必要があります。

フィールド名の例:

User
User_1
User_Name
user-name
my.org.User

4.7.2 Componentsオブジェクトの例

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

4.8 Paths オブジェクト

個々のエンドポイントおよびそれらの操作への相対パスを保持します。 パスは完全な URL を構築するために Server Object の URL に追加されます。MAY は ACL(アクセス制御リスト(ACL)制約)のために空でもあり得ます。

4.8.1 パターン化フィールド

フィールドパターン 説明
/{path} Path Item Object 個々のエンドポイントへの相対パス。フィールド名はスラッシュ(/)で始まることがMUSTです。Server Objecturl フィールドからの URL に、このパスが(相対 URL 解決なしで)追加されて完全な URL が構築されます。パスのテンプレート化が許可されています。URL の照合時には、テンプレート化されていない具体的なパスがテンプレート化された対応物より先にマッチします。同じ階層でテンプレート名が異なるテンプレート化パスは同一であるため、存在してはならない(MUST NOT)とされます。曖昧なマッチングが発生した場合、どちらを使用するかはツール側の判断に委ねられます。

このオブジェクトは 仕様拡張(Specification Extensions) によって拡張されることがMAY あります。

4.8.2 パスのテンプレート化

パスのテンプレート化とは、中括弧({})で区切られたテンプレート式を使用して、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          = "!" / "$" / "&" / "'" / "(" / ")"
                    / "*" / "+" / "," / ";" / "="

ここで、pcharunreservedpct-encoded、および sub-delims の定義は [RFC3986] から採られています。path-templateRFC 3986 セクション 3.3 から直接導出されています。

各テンプレート式は単一のパステンプレート内で複数回出現してはならない(MUST NOT)です。

追加のガイダンスについては 付録 C: RFC6570 ベースのシリアル化の使用 を参照してください。

4.8.2.1 パステンプレートのマッチング

次のパスを仮定すると、具体的な定義である /pets/mine が最初にマッチします:

  /pets/{petId}
  /pets/mine

次のパスは同一とみなされ、無効です:

  /pets/{petId}
  /pets/{name}

次のようなパスは曖昧な解決を引き起こす可能性があります:

  /{entity}/me
  /books/{id}

4.8.3 Paths オブジェクトの例

/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'

4.9 Path Item オブジェクト

単一のパスで利用可能な操作を説明します。 Path Item は ACL(アクセス制御リスト)制約により空であり得ます(MAY)。 パス自体はドキュメントビューアに表示されますが、どの操作やパラメータが利用可能かは分からない場合があります。

4.9.1 固定フィールド

フィールド名 説明
$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 あります。

4.9.2 Path Item オブジェクトの例

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'

4.10 Operation オブジェクト

パス上の単一の API 操作を説明します。

4.10.1 固定フィールド

フィールド名 説明
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 メソッドで完全にサポートされます。それ以外の、メッセージコンテンツを推奨しない(例えば GETDELETE のような)場合には、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 あります。

4.10.2 Operation オブジェクトの例

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

4.11 外部ドキュメントオブジェクト

拡張ドキュメントのために外部リソースを参照することを可能にします。

4.11.1 固定フィールド

Field Name Type Description
description string 対象ドキュメントの説明です。 [CommonMark] 構文を用いてリッチテキスト表現を行うことがMAY できます。
url string REQUIRED。対象ドキュメントの URI です。これは URI の形式であることがMUSTです。

This object MAY be extended with Specification Extensions.

4.11.2 外部ドキュメントオブジェクトの例

description: Find more info here
url: https://example.com

4.12 パラメータオブジェクト

単一の操作パラメータを記述します。

一意のパラメータは namelocation の組み合わせで定義されます。

パーセントエンコーディングの問題(application/x-www-form-urlencoded クエリ文字列形式との相互作用を含む)については、詳細は 付録 E を参照してください。

4.12.1 パラメータの配置場所

in フィールドで指定される可能なパラメータ配置は5つあります:

  • path - Path Templating と共に使用され、パラメータ値が実際に操作の URL の一部として含まれるものです。これは API のホストやベースパスを含みません。例えば /items/{itemId} では、パスパラメータは itemId です。
  • query - URL に追加されるパラメータ。例えば /items?id=### ではクエリパラメータは id です;MUST NOT は同じ操作(またはその操作の path-item)で in: "querystring" パラメータと共に出現してはなりません。
  • querystring - URL クエリ文字列全体を値として扱うパラメータで、MUST 通常 content フィールドを使用して指定され、ほとんどの場合メディアタイプは application/x-www-form-urlencoded になります。これはそのメディアタイプのリクエストボディと同様に Encoding Objects を使用できます;MUST NOT は複数回出現してはならず、また任意の in: "query" パラメータと同じ操作(またはその操作の path-item)に出現してはなりません。
  • header - リクエストの一部として期待されるカスタムヘッダ。なお [RFC9110] の Section 5.1 はヘッダ名が大文字小文字を区別しないことを示しています。
  • cookie - 特定のクッキー値を API に渡すために使用されます。

4.12.2 固定フィールド

パラメータのシリアライズ規則は2つの方法のいずれかで指定されます。 Parameter Objects は content フィールドか schema フィールドのいずれか一方を必ず含めなければならず、両方を同時に含めてはなりません(MUST)。 さまざまな型の値を文字列表現に変換する議論については 付録 B を参照してください。

4.12.2.1 共通の固定フィールド

これらのフィールドは content または schema のいずれにもMAY 使用できます。

exampleexamples フィールドは相互に排他的です;検証要件については Working with Examples を参照してください。

Field Name Type Description
name string REQUIRED。パラメータの名前です。パラメータ名は大文字小文字を区別します。
  • If in is "path", the name field MUST correspond to a single template expression occurring within the path field in the Paths Object. See Path Templating for further information.
  • If in is "header" and the name field is "Accept", "Content-Type" or "Authorization", the parameter definition SHALL be ignored.
  • If in is "querystring", or for certain combinations of style and explode, the value of name is not used in the parameter serialization.
  • For all other cases, the name corresponds to the parameter name used by the in field.
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.

4.12.2.2 schema 使用時の固定フィールド

より単純なシナリオでは、schemastyle によってパラメータの構造と構文を記述できます。

これらのフィールドは in: "querystring" と共に使用してはMUST NOT です。

schema を持つパラメータで in: "header" または in: "cookie", style: "cookie" の場合は注意が必要です:

  • これらの値をシリアライズする際、URI パーセントエンコーディングはMUST NOT 適用されます。
  • これらのパラメータを解析する際、見かけ上のパーセントエンコーディングはMUST NOT デコードされてはなりません。
  • 自動的にエンコードまたはデコードを行う RFC6570 実装を使用する場合、使用前にその処理を取り消す必要がMUST あります。

これらの場合、実装は引用やエスケープを試みるのではなく値をそのまま通過させることが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 です。このフィールドは自動的にパーセントエンコードを行う instyle の組み合わせにのみ適用されます。
schema Schema Object パラメータに使用される型を定義するスキーマです。

追加のガイダンスについては 付録 C: RFC6570 ベースのシリアル化の使用 を参照してください。

4.12.2.3 content 使用時の固定フィールド

より複雑なシナリオでは、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エントリのみを含む必要があります。

4.12.3 Style 値

単純なパラメータをシリアライズする一般的な方法をサポートするために、一連の 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 の collectionFormatcsv 値に相当します。
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 の collectionFormatssv に相当します。
pipeDelimited array, object query パイプで区切られた配列値やオブジェクトのプロパティと値。これは OpenAPI 2.0 の collectionFormatpipes に相当します。
deepObject object query スカラーのプロパティを持つオブジェクトをフォームパラメータで表現することを可能にします。配列やオブジェクトのプロパティの表現は定義されていません(代替案は Extending Support for Querystring Formats を参照)。
cookie primitive, array, object cookie form に類似しますが、[RFC6265] の Cookie 構文ルールに従います。つまり名前と値のペアはセミコロンと単一の空白で区切られ(例: n1=v1; n2=v2)、パーセントエンコードや他のエスケープは適用されません;エスケープが必要なデータ値は事前にエスケープされた形で提供される必要があります。

4.12.4 URL パーセントエンコーディング

すべての API URL は [RFC3986] の規則に従って正しく解析されパーセントデコードされることがMUST です。

application/x-www-form-urlencoded 形式のコンテンツ、つまり Parameter Objectsin: "query" によって生成されるクエリ文字列も、WHATWG-URL の規則に従って正しく解析されパーセントデコードされることがMUST です。ここには非パーセントエンコードされた + をエスケープされたスペース文字として扱うことが含まれます。

これらの要件はパーセントデコードのルールの観点で規定されており、URI に適用されるさまざまな標準のバージョン間で一貫して寛容です。

パーセントエンコーディングは複数の箇所で行われます:

  • [RFC6570] 実装(またはそれを模した実装)によって
  • パラメータや Encoding オブジェクトが、URI パーセントエンコーディングを本来含まないメディアタイプのために Media Type Object と共に値を組み込むときに
  • ユーザが RFC6570 の reserved expansion プロセスにデータを渡す前に行う場合

パーセントエンコーディングを行う際の最も安全な方法は、RFC3986 の「unreserved」セットに含まれないすべての文字をパーセントエンコードし、form-urlencoded についてはチルダ文字(~)もパーセントエンコードすることです。これは form-urlencoded が作られた当時の URI RFC([RFC1738])に由来する歴史的要件に合わせるためです。本仕様の例ではこのアプローチが使用されています。

form-urlencoded に関して、[WHATWG-URL] のエンコーディングアルゴリズムは空白を + としてエスケープすることを要求しますが、%20 としてパーセントエンコードすることも上記要件を満たします。RFC6570 のデフォルト(非予約)フォームスタイル拡張を使用する場合の例では %20 を優先し、それ以外は + を使用します。

予約文字は予約目的で使用される場合にパーセントエンコードしてはならず(MUST NOT)、例えば &=+form-urlencoded 用、, は RFC6570 展開で非エクスプロードされた配列やオブジェクト値を区切るために使用されます。手動でパーセントエンコードを行うことでデータに非パーセントエンコードの区切り文字を挿入すると、結果は未定義であり実装が正しいデータ構造へ解析できなくなる可能性が高いです。場合によっては、パスパラメータ値に / を挿入することは本仕様で明示的に禁止されています。

参照:

  • 付録 C — RFC6570 実装の使用または模倣/拡張に関するガイダンス。
  • 付録 D — パーセントエンコーディングとクッキー、ならびにヘッダとクッキーのための他のエスケープ手法に関するガイダンス。
  • 付録 E — パーセントエンコーディングの選択肢、互換性、および RFC3986 で許可されない OAS 定義の区切り文字の取り扱いに関する詳細な議論。

4.12.5 シリアライズと例

このセクションの規則は Parameter および Header オブジェクトの両方に適用され、両者は同じメカニズムを使用します。

シリアライズされた例(例えば Example ObjectserializedValueexternalValue フィールド)を示す場合、ほとんどの場合表示すべき値は単に値そのものであり、関連するすべてのパーセントエンコードやその他のエンコード/エスケープが適用され、さらに styleexplode 設定によって生成される区切り文字も含める必要があります。

名前がシリアライズの構築に固有に含まれる場合(例えば style: "form" による name=value ペアや、style: "simple", explode: true の組み合わせなど)、名前および名前と値の間の区切りはMUST 含める必要があります。

matrixlabel スタイルは常に先頭に区切り文字を生成し、それは常にシリアライズの有効な一部であり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 レスポンスヘッダの例表示に関する特別な規則があります。

4.12.6 スタイルの例

パラメータ名 color が次のいずれかの値を持つと仮定します。右側の -> の後が Example Object の dataValue フィールドに表示される値です:

   string -> "blue"
   array -> ["blue", "black", "brown"]
   object -> { "R": 100, "G": 200, "B": 150 }

次の表は、各値に対する異なるシリアライズ方法の serializedValue フィールドに表示されるようなシリアライズ例を示します。

  • 値の empty は空文字列を示し、allowEmptyValue フィールドとは無関係です。
  • n/a とマークされた組み合わせの振る舞いは未定義です。
  • undefined 列は以前の仕様での empty 列に代わるもので、RFC6570 の用語により整合させるために導入されています。これは null など特別な処理を要する「未定義」値を指し、空文字列は未定義ではありません。
  • form および RFC6570 以外のクエリ文字列スタイルである spaceDelimited, pipeDelimited, deepObject については、複数パラメータからのクエリ文字列構築に関する詳細は 付録 C を参照し、formcookie パラメータに関する警告は 付録 D を参照してください。
  • 例は上記の URL Percent-Encoding セクションで説明されるとおりパーセントエンコードされています;詳しくは 付録 E を参照してください。
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

4.12.7 クエリ文字列形式のサポート拡張

多くのフレームワークは配列インデックスをパラメータ名に付加したり、ネストしたオブジェクトの複数レベルを示したりするなど、複雑な値のためのクエリ文字列構文を定義しており、これは deepObject の能力をはるかに超えます。

これらは標準ではなく互いに矛盾することが多いため、OAS はそれらを直接サポートしようとはしません。 in: "querystring" でそのような形式をサポートするためには次の二つの方法があります:

  • contenttext/plain を使用し、スキーマを type: "string" として OpenAPI の外でフォーマットを定義する。これはドキュメント化や構築・解析により多くの作業を必要としますが、OpenAPI の観点では単なる文字列として扱われるため柔軟な選択肢です。
  • メディアタイプ(必ずしも IANA 登録である必要はありません)と、インメモリデータをシリアライズされたメディアタイプにマッピングするプロセスを定義する。複数のツールでのサポート可能性を高めるため、そのメディアタイプとプロセスを OpenAPI Initiative の Media Type Registry に登録申請することを検討してください。

4.12.8 パラメータオブジェクトの例

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

4.13 Request Bodyオブジェクト

単一のリクエストボディを記述します。

4.13.1 固定フィールド

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.

4.13.2 Request Bodyの例

参照されたスキーマ定義を用いるリクエストボディの例です。

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

4.14 Media Typeオブジェクト

各 Media Type Object は、そのキーで識別されるメディアタイプに従って構造化されたコンテンツを記述します。 複数の Media Type Object は、いくつかの異なるメディアタイプのいずれかで現れる可能性のあるコンテンツを記述するために使用できます。

example または examples が提供されている場合、例は指定されたスキーマに一致し、メディアタイプとそのエンコーディングで指定された正しい形式であることがSHOULD 推奨されます。 exampleexamples のフィールドは相互排他的です。 非JSON/YAML 値を含む異なる例の指定方法に関する追加のガイダンスは Working With Examples を参照してください。

4.14.1 固定フィールド

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.

4.14.2 メディアタイプ

メディアタイプは IANA media types registry に公開登録されており、その手続きは [RFC6838] に記載されています。

API は GitHub の application/vnd.github.v3+json のようなプライベートメディアタイプを定義することもあり、必ずしも登録されていないメディアタイプや、後に広く使われるようになった application/schema+json のようなものも存在します。

さまざまなメディアタイプでスキーマを使用する際の指針については、Schema Object の下の Parsing and Serializing を参照してください。

4.14.2.1 OpenAPIメディアタイプレジストリ

OpenAPI Initiative は、この仕様で期待されるメディアタイプのサポートを要約し、各メディアタイプに関連する節への索引を提供する Media Type Registry を維持しています。レジストリは IANA 登録(存在する場合)や各メディアタイプに関連する主要な仕様文書へのリンクも含みます。 このレジストリに追加される拡張や他の OpenAPI 仕様の後続バージョン向けの追加メディアタイプは、本バージョンの OAS 実装でサポートされることがMAYあります。

4.14.3 完全 vs ストリーミングコンテンツ

schema フィールドは、メディアタイプおよびコンテキスト(Request Body ObjectResponse ObjectParameter Object、または Header Object によって定義される)で定義される完全なコンテンツに適用されることがMUST です。 これはコンテンツをメモリに完全に読み込むことを要求するため、ストリーミングコンテンツには課題をもたらします。 クライアントが読み取りをいつ止めるかを選択することが想定されるユースケースは特に困難で、ストリームの終了が明確でないためです。

4.14.3.1 逐次メディアタイプ

本仕様内では、順次的メディアタイプ はヘッダ、フッタ、エンベロープ、その他のメタデータを持たず、繰り返し構造のみからなる任意のメディアタイプとして定義されます。

順次的メディアタイプの例(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 も参照してください。

4.14.3.1.1 ストリーミング逐次メディアタイプ

itemSchema フィールドは、順次的メディアタイプのストリーミングユースケースをサポートするために提供されており、対応するエンコーディングメカニズムとして itemEncoding が位置ベースの multipart メディアタイプ向けに用意されています(positional multipart media types を参照)。

schema が完全なコンテンツに適用されるのに対し(前述の順次的メディアタイプのセクションで配列として扱われる)、itemSchema はストリーム内の各アイテムに個別に適用されることがMUST であり、読み取られるごとに各アイテムを処理できることをサポートします。

schemaitemSchema の両方を同じ Media Type Object で使用することはMAY ですが、通常は schema フィールド内で items キーワードを使うのと比べて大きな利点はありません。

4.14.3.2 バイナリストリーム

maxLength キーワードは、文字列データ(エンコードされたバイナリデータを含む)または非エンコードのバイナリデータで構成されるストリーミングペイロードの想定上限を設定するためにMAY 使用できます。 非エンコードのバイナリデータの場合、長さはオクテット数です。 このユースケースでは、JSON Schema がバイナリデータに直接適用されないため、maxLength は通常の JSON Schema 評価の外で実装されることがMAY ありますし、エンコードされたバイナリストリームを完全にメモリに保持するのは現実的でない場合があります。

4.14.4 サーバー送信イベントの特記事項

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 のキーワード(特に contentMediaTypecontentSchema)を使用して、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

4.14.5 エンコーディングの使用と制限

これらのエンコーディングフィールドは、各 Encoding Object をデータ内の特定の値にどのようにマップするかを定義します。 各フィールドはそれぞれ使用できるメディアタイプの集合を持ち、それ以外のメディアタイプに対してはこれら三つのフィールドはすべてSHALL 無視されます。

4.14.5.1 名前によるエンコーディング

encoding フィールドの挙動はウェブフォームをサポートするように設計されているため、繰り返し値を許す名前と値のペアとして構造化されたメディアタイプ、特に application/x-www-form-urlencodedmultipart/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 を参照してください。

4.14.5.2 位置によるエンコーディング

ほとんどの multipart メディアタイプ(基礎となるルールを定義する multipart/mixed を含む)は、名前付きパートを持ちません。これらのメディアタイプのデータは配列としてモデル化され、各パートに対して順序どおりに1アイテムが対応します。

prefixEncoding および/または itemEncoding フィールドを使用するには、itemSchema または配列の schema が存在することがMUST です。 これらのフィールドは prefixItemsitems の JSON Schema キーワードに類似しており、prefixEncoding(存在する場合)はデータ配列内の同じ位置の値に適用される Encoding Object の配列を提供し、itemEncoding は配列中の残りのアイテムすべてに対して単一の Encoding Object を適用します。 prefixItems と同様に、インスタンス配列が prefixEncoding 配列より短くてもエラーではなく、追加の Encoding Object は無視されることがSHALL です。

itemEncoding フィールドは itemSchema と共に使用してストリーミング multipart コンテンツをサポートすることもできます。

4.14.5.3 追加のエンコーディング手法

prefixEncoding フィールドは任意の multipart コンテンツで固定のパート順序を要求するために使用できます。 これには multipart/form-data も含まれ、プロパティ名が存在しないため Encoding Object の headers フィールドを使用して Content-Disposition とパート名を提供する必要があることに注意してください。

本仕様の以前のバージョンでは、multipart/form-data 以外の multipart メディアタイプで encoding フィールドの制限を回避するために各パートの Content-Disposition: form-data ヘッダの name parameter を使用することが推奨されていました。実装はこの回避策をサポートすることがMAY ありますが、この使用法は一般的ではないため、非 form-datamultipart メディアタイプの実装がこれをサポートする可能性は低いです。

4.14.6 Media Typeの例

フォーム関連および multipart メディアタイプの例については、Encoding Object を参照してください。

4.14.6.1 JSON

この例は 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'
4.14.6.2 逐次JSON

アイテムが JSON 値である任意の 順次的メディアタイプ において、各値の変換は不要です。JSON Text Sequences([RFC7464] の application/json-seq や [RFC8091] の +json-seq 構造接尾辞)、JSON Linesapplication/jsonl)、および NDJSONapplication/x-ndjson)はこのカテゴリに含まれます。JSON Lines と NDJSON のメディアタイプは IANA に登録されていませんが、広く使われています。

次の例は、ストリーミングログエントリとクエリに対する固定長セットの両方のための Media Type Object を示します。これは schemaitemSchema の関係と、それぞれを使用する場合を示しています(例フィールドはどちらの場合も同じです)。

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!"
}
4.14.6.3 サーバー送信イベントストリーム

この例では、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}"}

4.14.7 ファイルアップロードの注意事項

OpenAPI 2.0 と対照して、OAS 3.x では file 入出力コンテンツは他のスキーマ型と同じ意味で記述されます。

OAS 3.0 と対照して、OAS 3.1 では format キーワードはスキーマのコンテンツエンコーディングに影響を及ぼしません。代わりに JSON Schema の contentEncodingcontentMediaType キーワードが使用されます。さまざまなシナリオをこれらのキーワードでモデル化する方法や、以前の 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 です。

4.15 Encodingオブジェクト

単一の値に適用される単一のエンコーディング定義であり、Encoding Object と値のマッピングは、Media Type Object によって、Encoding Usage and Restrictions の説明に従って決定されます。

さまざまな型の値を文字列表現に変換する議論については、Appendix B を参照してください。

フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。

4.15.1 固定フィールド

4.15.1.1 共通固定フィールド

これらのフィールドは、下のセクションで定義される 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 Objectencoding フィールドと同様に、ネストされた Encoding Object を適用します。
prefixEncoding [Encoding Object] Media Type ObjectprefixEncoding フィールドと同様に、ネストされた Encoding Object を適用します。
itemEncoding Encoding Object Media Type ObjectitemEncoding フィールドと同様に、ネストされた Encoding Object を適用します。

このオブジェクトは Specification Extensions によって拡張されることがMAY あります。

contentType のデフォルト値は以下のとおりで、contentEncoding 列の n/acontentEncoding の存在や値が無関係であることを意味します。この表は、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

nulltype 値の扱い方は、null 値がどのようにシリアライズされるかによります。null 値が完全に省略される場合、contentType は無関係です。データ型変換のオプションについては Appendix B を参照してください。

4.15.1.2 RFC6570スタイルシリアライゼーション用の固定フィールド
Field Name Type Description
style string 特定のプロパティ値がその型に応じてどのようにシリアライズされるかを記述します。詳細は Parameter Objectstyle フィールドを参照してください。挙動は 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 を参照してください。

styleexplode、または allowReserved のいずれかが明示的な値で存在することは、in: "query" の Parameter Objects を schema とともに使用するのと同等です。これら三つのフィールドがすべて欠けている場合は、content を使用するのと同等ですが、メディアタイプは Media Type Object ではなく contentType で指定される点が異なります。

4.15.2 ネストされたエンコーディング

ネストされたフォーマット(特にネストされた multipart/mixed)がエンコーディングを必要とする場合、このオブジェクトの encodingprefixEncoding、および/または itemEncoding フィールドでサポートできます。実装は一レベルのネストをサポートすることがMUST であり、追加レベルをサポートすることはMAY です。

4.15.3 x-www-form-urlencodedメディアタイプのエンコーディング

Media Type Objectapplication/x-www-form-urlencoded を使用して、WHATWG-URL のルールに従ってフォーム URL エンコーディングするコンテンツを扱います。この設定では、複雑なオブジェクトが文字列にシリアライズされた後、該当するメディアタイプのための WHATWG-URL の規則に従ってコンテンツをパーセントエンコードすることがMUST となります。

フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。

4.15.3.1 例:JSON値を含むURLエンコードフォーム

encoding フィールドがない場合、シリアライゼーション戦略は Encoding Object のデフォルト値に基づきます:

requestBody:
  content:
    application/x-www-form-urlencoded:
      schema:
        type: object
        properties:
          id:
            type: string
            format: uuid
          address:
            type: object
            properties: {}

この例では、idf81d4fae-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
4.15.3.2 例:バイナリ値を含むURLエンコードフォーム

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 を参照)、これは保証されないため、互換性を高めるにはパディングを保持してパーセントデコードに依存する方が良い場合があります。

4.15.4 multipart メディアタイプのエンコーディング

スキーマプロパティとパートを関連付けるガイダンスについては、Encoding Usage and Restrictions を参照してください。

multipart メディアタイプ全般(および特に multipart/form-data)で使用できるヘッダには重大な制約がある点に注意してください([RFC2046] Section 5.1 および [RFC7578] Section 4.8 を参照)。

4.15.4.1 複数の contentType 値の扱い

contentType に複数の値が提供される場合でも、パートの実際の Content-Type がドキュメントに含まれるため解析は簡単です。

エンコードおよびシリアライゼーションのために、実装はアプリケーションがどのメディアタイプを意図しているか示すための仕組みを提供することがMUST です。実装は代替としてメディアタイプのスニッフィング(SNIFF)を提供することがMAY ありますが、このプロセスにはセキュリティリスクがあるためデフォルト動作にしてはなりません(MUST NOT)。

4.15.4.2 Content-Transfer-EncodingcontentEncoding

multipart フィールドに対して contentEncoding を使用することは、Content-Transfer-Encoding を含む headers フィールドを持ち、その値が contentEncoding で使用される値を要求するスキーマを持つ Encoding Object を指定するのと同等です。もし contentEncoding が multipart フィールドに使用され、そのフィールドに対する Encoding Object の headers に含まれる Content-Transfer-EncodingcontentEncoding の値を許容しない場合、シリアライズおよび解析の結果は未定義になります。

Working with Binary Data で述べられているように、Encoding Object の contentType(明示的またはデフォルトによる)が Schema Object の contentMediaType と矛盾する場合、contentMediaTypeSHALL 無視されます。このため、そして Encoding Object の contentType のデフォルト規則が Schema Object の contentMediaType を考慮に入れていないため、Encoding Object とともに contentMediaType を使用することはNOT RECOMMENDED です。

また、Content-Transfer-Encoding は HTTP でバイナリデータがサポートされているため、multipart/form-data に対しては非推奨である点に注意してください([RFC7578] Section 4.7)。

フォームメディアタイプに関するパーセントエンコーディングの詳細な検討については、Appendix E を参照してください。

4.15.4.3 例:基本的なマルチパートフォーム

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'
4.15.4.4 例:エンコーディングオブジェクト付きマルチパートフォーム

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
4.15.4.5 例:複数ファイル付きマルチパートフォーム

[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 のメディアタイプを示します。

4.15.4.6 例:順序付き・無名マルチパート

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/*
4.15.4.7 例:必須ヘッダー付き順序マルチパート

[RFC2557] に記載されているように、ウェブページを構成するリソース群は multipart/related ペイロードで送られ、text/html ドキュメントからスクリプトやスタイルシート、画像などへのリンクを保持するために各ページに対して Content-Location ヘッダを定義できます。最初のパートがルートリソースとして使用され(Content-ID を使用する場合を除くが RFC2557 はそれを推奨せず、本例では禁止しています)、したがって先頭要素に HTML リソースであることを要求するために prefixItemsprefixEncoding を使用し、その後に任意の型のリソースが並べられることを許容します。

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'
4.15.4.8 例:ストリーミングマルチパート

この例は、大量の画像を撮影してそれらをストリームするデバイスを想定しています。前の例とは異なり、ここでは各画像が到着次第(または小さなバッチで)処理されることが期待されるため、すべてをバッファリングするのはメモリ的に不可能であることが分かっているため itemSchema を使用します。

multipart/mixed:
  itemSchema:
    $comment: A single data image from the device
  itemEncoding:
    contentType: image/jpg
4.15.4.9 例:ストリーミングバイトレンジ

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
4.15.4.10 例:ネストされた multipart/mixed

これは二部構成の 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

4.16 Responsesオブジェクト

ある操作の予想されるレスポンスのコンテナです。 このコンテナは HTTP レスポンスコードを期待されるレスポンスにマップします。

ドキュメントは、事前に知られていない可能性のあるすべての HTTP レスポンスコードを網羅することを必ずしも期待していません。 ただし、成功した操作のレスポンスと既知のエラーはドキュメント化されることが期待されます。

default MAY は、Responses Object に個別に含まれていないすべての HTTP コードに対するデフォルトの Response Object として使用できます。

Responses Object は少なくとも1つのレスポンスコードを含まなければならず(MUST)、もし 1 つのみのレスポンスコードが提供される場合、それは成功した操作呼び出しのレスポンスであることがSHOULD です。

4.16.1 固定フィールド

Field Name Type Description
default Response Object | Reference Object 特定の HTTP レスポンスコードとして宣言されているもの以外のレスポンスのドキュメントです。宣言されていないレスポンスをカバーするためにこのフィールドを使用します。

4.16.2 パターン化フィールド

Field Pattern Type Description
HTTP Status Code Response Object | Reference Object 任意の HTTP ステータスコード をプロパティ名として使用できますが、各コードにつきプロパティは 1 つだけで、その HTTP ステータスコードに対する期待されるレスポンスを記述します。JSON と YAML の互換性のため、このフィールドは引用符で囲むことがMUSTです(例: “200”)。レスポンスコードの範囲を定義するために、大文字のワイルドカード文字 X をこのフィールドに含めることがMAY あります。例として 2XX200 から 299 までのすべてのレスポンスコードを表します。許可される範囲定義は次のみです: 1XX, 2XX, 3XX, 4XX, 5XX。もし明示的なコードでレスポンスが定義されている場合、その明示的コードの定義が範囲定義より優先されます。

このオブジェクトは Specification Extensions によって拡張されることがMAY あります。

4.16.3 HTTPステータスコード

HTTP ステータスコードは実行された操作の状態を示すために使用されます。 ステータスコードは IANA Status Code Registry に登録されている利用可能なステータスコードから選択することがSHOULD 推奨されます。

4.16.4 Responsesオブジェクトの例

成功した操作の 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'

4.17 Responseオブジェクト

API 操作からの単一レスポンスを記述します。レスポンスに基づいて設計時に静的な links を含めることができます。

4.17.1 固定フィールド

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 あります。

4.17.2 Responseオブジェクトの例

複雑型の配列を返すレスポンスの例:

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

4.18 Callbackオブジェクト

親操作に関連する可能性のあるアウトオブバンドのコールバックのマップです。 マップ内の各値は Path Item Object で、API プロバイダが開始する可能性のある一連のリクエストと期待されるレスポンスを記述します。 Path Item Object を識別するために使用されるキー値は、実行時に評価される式であり、コールバック操作に使用する URL を特定します。

API プロバイダからの受信リクエストを別の API 呼び出しから独立して記述するには、webhooks フィールドを使用してください。

4.18.1 パターン化フィールド

Field Pattern Type Description
{expression} Path Item Object コールバックリクエストと期待されるレスポンスを定義するために使用される Path Item Object です。完全な例 が利用可能です。

このオブジェクトは Specification Extensions によって拡張されることがMAY あります。

4.18.2 キー式

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

4.18.3 Callbackオブジェクトの例

次の例は、ユーザ提供のクエリ文字列パラメータ 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

次の例は、サーバがハードコードされているが、クエリ文字列パラメータがリクエストボディの idemail のプロパティから埋められるコールバックの例を示します。

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

4.19 Exampleオブジェクト

内部または外部の例値を基本的な summarydescription メタデータとまとめるオブジェクトです。 例は、スキーマ検証に適したデータ、または包含する Media Type ObjectParameter Object、あるいは Header Object に要求されるシリアライズ済みデータのいずれかを示すことができます。 このオブジェクトは通常 examples(複数)という名前のフィールドで使用され、参照可能な代替手段として古い単体の example フィールドより優れています。 さまざまなフィールドと例の種類については Working With Examples で詳述されています。

4.19.1 固定フィールド

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 の場合、このフィールドは通常使用すべきではありません。もしこのフィールドが存在する場合、valueexternalValue は存在してはなりません。
externalValue string 別ドキュメント内のシリアライズ済み例を指し示す URI です。Unicode 文字列として簡単に表現できない値を扱うために使用します。もし dataValue が存在する場合、このフィールドはそのデータのシリアライズを指し示すことがSHOULD です。そうでない場合、この値は dataValue として有効でなければならないデータ値の有効なシリアライズであることがSHOULD です。もしこのフィールドが存在する場合、serializedValuevalue は存在してはなりません。相対参照の解決規則については Relative References を参照してください。
value Any 埋め込みリテラル例です。value フィールドと externalValue フィールドは相互排他的です。JSON や YAML で自然に表現できないメディアタイプの例を表現するには、必要に応じてエスケープを行った文字列として例を格納してください。

非 JSON シリアル化ターゲットに対する非推奨:明確な構文と意味を持つ dataValue および/または serializedValue を使用してください。

このオブジェクトは Specification Extensions によって拡張されることがMAY あります。

あらゆる場合において、例の値は関連するスキーマと互換であることがSHOULD です。 ツール実装は互換性を自動的に検証し、互換性がない場合に例の値を拒否することがMAY あります。 互換性の正確な意味については Validating Examples を参照してください。

4.19.2 例との連携

Example Object は Parameter ObjectsHeader Objects、および Media Type Objects で使用できます。これら三つのオブジェクトでは、いずれも examples(複数)フィールドを通じて行われます。 しかし、例を提供する他の方法もいくつかあります: 単体の example(複数の examples と相互排他的)と、Schema Object 内のキーワード(古い単体の example と現在の複数の examples 配列)などです。 ここでは、Parameter/Header/Media Type オブジェクト内の単体 example(これは単に value フィールドのみを持つ単一の Example Object と同じ振る舞い)を「略式の example」と呼びます。 それぞれのフィールドにはわずかに異なる考慮点があります。

4.19.2.1 JSON互換およびvalue安全な例

value および略式の example フィールドは、最終的なシリアライズ形と JSON(または JSON 互換 YAML)表現の間に差がない場合に、serializedValue(または externalValue) と同じ 意味 を持ちながらより便利な 構文 を許す意図で設計されています。application/json や任意の +json メディアタイプに対してこの構文を使用する場合、これらのフィールドは事実上 dataValue と同等に振る舞うため、安全に使用できます。

単一文字列から成るデータで、text/plain のように文字列が追加のエスケープを必要としないシリアライズターゲットの場合、これらのフィールドも安全に使用できます。

その他のシリアライズターゲットについては「JSON や YAML で自然に表現できる」という曖昧さや過去の例テーブルの誤りが、一貫性のないサポートと使用を招いています。実務上、非 JSON ターゲットに対しては value と略式 example の振る舞いが実装依存になりがちであるため、互換性を確保したい OAD 作成者は他のフィールドの使用を推奨します。

4.19.2.2 使用するフィールドの選択

前節の注意点を念頭に置き、略式 example は Example Object が 1 つだけの場合に value の代わりに使用できることを踏まえ、どのフィールドを使うかのガイドラインは次のとおりです。

Schema Object によって検証されるように例を示すには:

  • 検証スキーマに例を保ちたい場合は、Schema Object の examples 配列(JSON Schema draft 2020-12)を使用します。
    • OAS v3.0 以前との互換性が必要な場合のみ Schema Object の単体 example を使用します。
  • 例をシリアライズの例として関連付けたい、またはスキーマから独立して保持したい場合は Example Object の dataValue を使用します。
    • OAS v3.1 以前との互換性が必要で、値が JSON や YAML で「自然に表現できる」場合のみ Example Object の value を使用します。

HTTP/1.1 メッセージを構築するためにどのようにシリアライズされるかを示すには:

  • シリアライズが有効な Unicode 文字列として表現でき、正確な文字エンコーディングを示す必要がない場合は、Example Object の serializedValue を使用します。
    • value の文字列形式は、OAS v3.1 以前との互換性が必要な場合にのみ使用してください。
  • それ以外のすべての値、または例を OpenAPI ドキュメントと分けて保持したい場合は、Example Object の externalValue を使用します。

serializedValueexternalValue はどちらもシリアライズ形を示さなければならず(MUST)、Media Type Objects では適切なメディアタイプの文書であり、Encoding Object の効果が適用されたものである必要があります。Parameter と Header オブジェクトで schemastyle を使う場合は、何がシリアライズされた値に相当するかは Style Examples を参照してください。

4.19.2.3 serializedExample の判定基準

次のいずれかが当てはまる場合、そのシリアライズは serializedValue に有効な Unicode 文字列として表現できます:

  • 文字セットパラメータ charset をサポートし任意の Unicode エンコーディング(UTF-8, UTF-16 等)を示せるメディアタイプである場合。
  • URI や HTTP フィールドのように Unicode エンコーディングを要求またはデフォルトとするフォーマットである場合。
  • 全てのパートが上記のいずれかを満たす複合フォーマット(例: multipart/mixed で一部が application/json、他部が application/xml; charset=utf-8 の場合)である場合。

これらの場合、OAD の文字セット(JSON の相互運用文字セットとして UTF-8 を想定)から Unicode コードポイントへの変換およびその後のシリアライズ文字セットへの変換は定義されています。

externalValue の場合、文字セットが明示されておらずフォーマットやメディアタイプ規格でも決定できないときは、実装は UTF-8 を想定することがSHOULD です。

4.19.2.4 例の検証

ツール実装は互換性を自動的に検証し、互換性がない場合に例の値を拒否することがMAY あります。スキーマ準備済みのデータ形式の例では、これは簡単です。

シリアライズ済みの例では、いくつかのフォーマットが同じデータに対して複数の有効な表現を許す場合があり、付録 B に示すシナリオが含まれます。シリアライズ済みの例を解析して得られたデータを検証することで曖昧さを解消できる場合もありますが、解析自体が曖昧になる場合もあり得ます。したがって、シリアライズ済み例の検証は最善努力の機能であることに注意してください。

4.19.3 Exampleオブジェクトの例

4.19.3.1 JSONの例

YAML で記述する際、dataValue に対して JSON 構文を使用でき(noRating 例で示すように)必須ではありません。 この例は JSON に関する dataValueserializedValue の振る舞いを示しますが、ほとんどの場合はデータ形式のみで十分です。

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
          }
4.19.3.2 バイナリの例

完全なバイナリデータは externalValue を使って示します:

content:
  image/png:
    schema: {}
    examples:
      Red:
        externalValue: ./examples/2-by-2-red-pixels.png
4.19.3.3 ブールクエリパラメータの例

真偽値のシリアライズ方法に標準が存在しないため(付録 B 参照)、この例では特定のパラメータに対する真偽値のシリアライズを示すために dataValueserializedValue を使用しています:

name: flag
in: query
required: true
schema:
  type: boolean
examples:
  "true":
    dataValue: true
    serializedValue: flag=true
  "false":
    dataValue: false
    serializedValue: flag=false

4.21 Headerオブジェクト

HTTP レスポンスのための単一のヘッダや、multipart 表現の個々のパートのためのヘッダを記述します(どのヘッダを記述できるかの制約については該当する Response Object および Encoding Object のドキュメントを参照してください)。

Header Object は Parameter Object の構造に従い、schema または content が存在するかに基づいてシリアライゼーション戦略を決定しますが、以下の変更点があります:

  1. name は指定してはMUST NOT であり、対応する headers マップ内で与えられます。
  2. in は指定してはMUST NOT であり、暗黙的に header です。
  3. 位置に依存するすべての特性はヘッダの位置に適用可能でなければなり(例:style)、これにより allowEmptyValueMUST NOT 使用できず、もし style を使う場合は "simple" に限定されることになります。

4.21.1 固定フィールド

4.21.1.1 共通の固定フィールド

これらのフィールドは content あるいは schema のいずれと共に使用することがMAY できます。

exampleexamples のフィールドは相互排他的です;検証要件に関するガイダンスは 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 あります。

4.21.1.2 schema 使用時の固定フィールド

より単純なシナリオでは、schemastyle によってヘッダの構造と構文を記述できます。

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 を参照してください。

4.21.1.3 content 使用時の固定フィールド

より複雑なシナリオでは、content フィールドがヘッダのメディアタイプとスキーマを定義し、その使用例を示すことができます。

Field Name Type Description
content Map[string, Media Type Object | Reference Object] ヘッダの表現を含むマップ。キーはメディアタイプで、値がそれを記述します。マップはMUST 1エントリのみを含む必要があります。

4.21.4 Header Object の例

型が 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"'

4.22 タグオブジェクト

これは Operation Object で使用される単一のタグにメタデータを追加します。 Operation Object のインスタンスで定義された各タグごとに Tag Object を必ずしも持つ必要はありません。

4.22.1 固定フィールド

フィールド名 説明
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 によって拡張できます。

4.22.2 タグオブジェクトの例

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

4.23 参照オブジェクト

OpenAPI 記述内の他のコンポーネントを内部および外部から参照するための単純なオブジェクトです。

$ref の文字列値は URI を含み([RFC3986])、参照される値を識別します。

相対参照の解決 のルールを参照してください。

4.23.1 固定フィールド

フィールド名 説明
$ref string REQUIRED。参照識別子です。これは URI の形式である必要があります(MUST)。
summary string デフォルトで参照先コンポーネントの SHOULD 上書きする短い要約です。参照先のオブジェクト種別が summary フィールドを許可しない場合、このフィールドは効果がありません。
description string デフォルトで参照先コンポーネントの説明を SHOULD 上書きする説明です。[CommonMark] 構文はリッチテキスト表現に MAY 使用できます。参照先のオブジェクト種別が description フィールドを許可しない場合、このフィールドは効果がありません。

このオブジェクトは追加プロパティで拡張することはできず、追加されたプロパティは SHALL 無視されます。

この追加プロパティに関する制限は、Schema Objects$ref キーワードを含むもの)との違いであることに注意してください。

4.23.2 参照オブジェクトの例

$ref: '#/components/schemas/Pet'

4.23.3 相対スキーマ文書の例

$ref: Pet.yaml

4.23.4 埋め込みスキーマを含む相対文書の例

$ref: definitions.yaml#/Pet

4.24 スキーマオブジェクト

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 ドキュメントを消費するアプリケーションに意味の定義を委ねます。

4.24.1 JSON Schema キーワード

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 によって拡張されています:

  • description - [CommonMark] 構文はリッチテキスト表現に MAY 使用できます。
  • format - 詳細は Data Type Formats を参照してください。JSON Schema の定義済みフォーマットに加え、OAS はいくつかの追加の事前定義フォーマットを提供します。

OAS ダイアレクトを構成する JSON Schema キーワードに加えて、Schema Object は他の語彙からのキーワードや任意のプロパティをサポートします。

JSON Schema 実装は OpenAPI Specification の基本語彙で定義されたキーワードを 未知のキーワード として扱うことが MAY あります。これは OAS ダイアレクトに含まれており $vocabulary の値が false であるためです。 OAS 基本語彙は次のキーワードで構成されます:

4.24.2 固定フィールド

フィールド名 説明
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- プレフィックスを省略できる点に注意してください。

4.24.3 データ型

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 は整数を数学的に定義します。つまり 11.0 は等価であり、どちらも整数と見なされます。

4.24.3.1 データ型のフォーマット

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: numbertype: integer の両方がデータモデル上は数値と見なされます。

4.24.4 解析とシリアライズ

API データにはいくつかの形式があります:

  1. 特定のメディアタイプのドキュメント、HTTP ヘッダー値、もしくは URI の一部である「シリアライズされた形式」。
  2. Schema Object として使用することを意図した「データ形式」。
  3. JSON Schema の formatcontentType のようなキーワードが伝える追加情報、およびクラス階層など仕様の範囲外の追加情報を組み込んだ「アプリケーション形式」。これらは Discriminator ObjectData Modeling Techniques に基づく場合があります。
4.24.4.1 JSON データ

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 仕様に従って利用可能であることのみを要求します。

4.24.4.2 非 JSON データ

非 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/codecode プロパティの起点スキーマ)
  • #/components/schemas/FormData/properties/code/allOf/0allOf を辿り type: [string, number] を発見)
  • #/components/schemas/FormData/properties/code/allOf/1allOf を辿り type: string を発見)
  • #/components/schemas/FormData/properties/countcount プロパティの起点スキーマ、type: integer を発見)
  • #/components/schemas/FormData/properties/extraextra プロパティの起点スキーマ、type: object を発見)

code に関しては最初に曖昧な type を見つけ、その後に別の type キーワードを見つけて二つの可能性のうち一方のみが有効であることが確定した点に注意してください。

この検査から、code は数値のように見える文字列であり、count はスキーマ検証の前に数値に解析する必要があることが判定されます。さらに extra は実際には info プロパティを含むオブジェクトの XML シリアライズであることがわかります。 つまりこのシリアライズのデータ形式は次の JSON オブジェクトに相当します:

{
  "code": "1234",
  "count": 42
  "extra": {
    "info": "abc"
  }
}

このオブジェクトをシリアライズするには Encoding Objects とプロパティを関連付ける必要があり、contentType フィールドのデフォルト値を決めるための調査が必要になる場合があります。検証済みデータが利用できない場合、スキーマ検査のプロセスは解析時と同じになります。

この例では codecount はプリミティブ型で encoding フィールドに現れないためプレーンテキストとしてシリアライズされます。しかし extra フィールドはオブジェクトであり、デフォルトでは JSON としてシリアライズされますが、encoding フィールドの extra エントリはそれを代わりに XML でシリアライズするよう指示しています。

4.24.4.3 バイナリデータの取り扱い

OAS は raw(生)バイナリデータと encoded(エンコード済み)バイナリデータのいずれも記述できます。

  • raw binary はエンコードされていないバイナリデータが許可される場合に使用します。例えば全体の HTTP メッセージボディとしてバイナリペイロードを送る場合や、バイナリ部分を許す multipart/* ペイロードの一部として使用する場合です。
  • encoded binary はバイナリデータが application/jsonapplication/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 ヘッダは存在しません。

contentEncodingbase64url を使うと、(クエリ文字列や application/x-www-form-urlencoded 型のメッセージボディで必要な)URL エンコーディングが既にエンコード済みのバイナリデータをさらにエンコードする必要がなくなります。

contentMediaType キーワードはメディアタイプが既に次の場所で設定されている場合は冗長です:

Schema Object が非 OAS 対応の JSON Schema 実装によって処理される場合、冗長であっても contentMediaType を含めることが有用な場合があります。ただし、contentMediaType が関連する Media Type Object や Encoding Object と矛盾する場合、contentMediaTypeSHALL 無視されます。

ストリーミングバイナリペイロードについては Complete vs Streaming Content を参照してください。

4.24.4.3.1 スキーマ評価とバイナリデータ

多くの JSON Schema 実装はバイナリデータの直接サポートを持っていません。これはその仕様の必須部分ではないためです。

バイナリインスタンスをサポートする JSON Schema 実装にアクセスできない OAS 実装は、Working with Binary Data に従ってスキーマを検査し適用しなければなりません(MUST)。インスタンス全体がバイナリの場合、関連するキーワードは少ないためこれは簡単です。

しかし multipart メディアタイプはバイナリとテキストベースのデータを混在させることがあり、実装はスキーマ評価に対して二つの選択肢を持ちます:

  1. プレースホルダ値を使用する(バイナリデータに対して何らアサーションが適用されないと仮定し、条件付きスキーマキーワードがプレースホルダ値を異なる扱いにしないことを期待する)。
  2. スキーマを検査して適切なキーワード(properties, prefixItems 等)を見つけ、サブスキーマを分割してバイナリと JSON 互換データに別々に適用する。
4.24.4.3.2 OAS 3.0 からのバイナリ記述の移行

次の表は OAS 3.0 のバイナリデータ記述からの移行方法を示します。例として引き続き image/png を使用します:

OAS < 3.1 OAS >= 3.1 コメント
type: string
format: binary
contentMediaType: image/png 冗長であれば省略可能で、しばしば空の Schema Object になります
type: string
format: byte
type: string
contentMediaType: image/png
contentEncoding: base64
base64url を使うと base64 文字列を URL セーフに再エンコードする必要がなくなります

4.24.5 注釈による拡張検証

JSON Schema Draft 2020-12 は注釈を収集することをサポートしており(collecting annotations)、未認識のキーワードを注釈として扱うことも含みます(関連節)。 OAS 実装はこうした注釈や、宣言された JSON Schema 語彙の一部として認識されない拡張(extensions)を追加検証の基礎として使用してもよい(MAY)です。 JSON Schema Draft 2020-12 は拡張に x- プレフィックスを必須としない点に注意してください。

4.24.5.1 非検証的制約キーワード

format キーワード(デフォルトの format-annotation 語彙を使用する場合)contentMediaType, contentEncoding, および contentSchema キーワード はデータに対する制約を定義しますが、直接検証されるのではなく注釈として扱われます。拡張検証はこれらの制約を適用する一つの方法です(MAY)。

4.24.5.2 readOnlywriteOnly の検証

readOnlywriteOnly キーワードは注釈です。JSON Schema は検証対象データがどのように使用されるかを認識しないためです。 これらのキーワードの検証は注釈、読み取りまたは書き込みの方向、および(該当する場合)フィールドの現在の値をチェックすることで行われることが MAY あります。 JSON Schema Validation Draft 2020-12 セクション9.4 はこれらのキーワードの期待動作を定義しており、リソース(「所有権を持つ権限」と記述される)は MAY readOnly フィールドを無視するかエラーとして扱うことができます。

必須かつ読み取り専用であるフィールドは、特に値が変更されていない場合に PUT で readOnly: true の制約を無視することが有益な例です。これにより GET でフィールドを正しく必須にしつつ、PUT では同じ表現とスキーマを使用できます。 読み取り専用フィールドが必須でない場合でも、それらを削除することはクライアントにとって負担となり、特に JSON データが複雑または深くネストされている場合に顕著です。

readOnly の振る舞いは特に本仕様のバージョン 3.0 で指定されていたものと異なる点があることに注意してください。

4.24.6 データモデリング手法

4.24.6.1 コンポジションと継承(ポリモーフィズム)

OpenAPI 仕様は JSON Schema の allOf キーワードを使用してモデル定義の結合や拡張を可能にし、実質的にモデルのコンポジションを提供します。allOf は独立して検証されるオブジェクト定義の配列を取り、それらが組み合わさって単一のオブジェクトを構成します。

コンポジションはモデルの拡張性を提供しますが、モデル間の階層を意味するものではありません。

JSON Schema はまた anyOfoneOf キーワードを提供しており、それぞれ少なくとも一つ、または正確に一つのスキーマが有効であることを定義できます。allOf と同様に、これらのスキーマは独立して検証されます。これらのキーワードは単一フィールドが複数の値の型を受け入れるポリモーフィズムを記述するために使用できます。

OpenAPI 仕様はポリモーフィズムのサポートを拡張して discriminator フィールド(値は Discriminator Object)を追加します。使用時、Discriminator Object は anyOfoneOf のどのスキーマがモデルの構造を検証することが期待されるかを示すプロパティ名を指示します。 識別プロパティは MAY 必須または任意として定義できますが、任意として定義される場合、Discriminator Object はどの anyOf または oneOf のスキーマ、あるいは allOf 内で現在のスキーマを参照するどのスキーマが識別プロパティが存在しないときにモデルの構造を検証するかを指定する defaultMapping フィールドを含めなければなりません(MUST)。

継承インスタンスの識別プロパティの値を定義する方法は二つあります:

  • スキーマ名を使用する。
  • スキーマ名を上書きする — プロパティを新しい値で上書きします。新しい値が存在する場合、それがスキーマ名に優先します。
4.24.6.2 ジェネリック(テンプレート)データ構造

実装は JSON Schema の動的参照機能を使用してジェネリックまたはテンプレートデータ構造を定義することを SHOULD サポートするべきです:

  • $dynamicAnchor$dynamicRef が解決できる可能性のあるスキーマ群(デフォルトのプレースホルダスキーマを含む)を識別します。
  • $dynamicRef はスキーマの起点から参照までのパス上で最初に見つかる一致する $dynamicAnchor に解決します(JSON Schema 仕様の説明による)。

例は下の Schema Object Examples セクションに含まれており、詳細は Learn OpenAPI サイトの “Dynamic References” ページを参照してください。

4.24.6.3 注釈付き列挙型

Schema Object の enum キーワードは個々の値に説明やその他の情報を関連付けることを許しません。

実装は各サブスキーマが const キーワードと titledescription のような注釈を含む oneOfanyOf を列挙型として追加情報付きで認識することを MAY サポートする場合があります。このパターンの正確な振る舞いは JSON Schema によって要求される範囲を超えて実装依存です。

4.24.6.4 XML モデリング

xml フィールドは JSON 定義を XML に変換する際の追加定義を許します。 XML Object は利用可能なオプションに関する追加情報を含みます。

4.24.7 スキーマダイアレクトの指定

どのダイアレクトやメタスキーマでリソースを処理するか(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 です。

4.24.8 スキーマオブジェクトの例

4.24.8.1 プリミティブ例
type: string
format: email
4.24.8.2 シンプルモデル
type: object
required:
  - name
properties:
  name:
    type: string
  address:
    $ref: '#/components/schemas/Address'
  age:
    type: integer
    format: int32
    minimum: 0
4.24.8.3 マップ/辞書プロパティを持つモデル

単純な文字列→文字列のマッピングの場合:

type: object
additionalProperties:
  type: string

文字列→モデルのマッピングの場合:

type: object
additionalProperties:
  $ref: '#/components/schemas/ComplexModel'
4.24.8.4 注釈付き列挙を持つモデル
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
4.24.8.5 例を含むモデル
type: object
properties:
  id:
    type: integer
    format: int64
  name:
    type: string
required:
  - name
examples:
  - name: Puma
    id: 1
4.24.8.6 コンポジションを持つモデル
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
4.24.8.7 ポリモーフィズム対応モデル

次の例は Pet モデルを示しており、petType プロパティによって猫か犬かを表現できます。各ペット種にはベースの Pet モデル以外の追加プロパティがあります。petType プロパティが存在しない、または catdog に一致しない値の場合、そのインスタンスは無効です。

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
4.24.8.8 Discriminator Object を用いたポリモーフィズム対応モデル

次の例は前節の例を拡張し、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
4.24.8.9 allOf と Discriminator Object を用いたポリモーフィズム対応モデル

allOf を使ってポリモーフィックなモデルを記述することも可能です。次の例は allOfDiscriminator 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
4.24.8.10 汎用データ構造モデル
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

4.25 識別子オブジェクト

リクエストボディやレスポンスのペイロードが複数の異なるスキーマのいずれかであり得る場合、これらは可能なスキーマを記述するために JSON Schema の anyOf または oneOf キーワードを使用するべきです(Composition and Inheritance を参照)。

ポリモーフィックなスキーマは MAY Discriminator Object を含めることができ、これは anyOfoneOf のどのスキーマ、あるいは allOf 内で現在のスキーマを参照するどのスキーマがモデルの構造を検証することが期待されるかのヒントとして使えるプロパティ名を定義します。 このヒントはシリアライズ、デシリアライズ、検証の支援に利用できます。 Discriminator Object は、名前付きプロパティの可能な値を暗黙的または明示的に別のスキーマに関連付けることでこれを行います。

discriminator はスキーマの検証結果を変更してはならないことに注意してください(MUST NOT)。

4.25.1 固定フィールド

フィールド名 説明
propertyName string REQUIRED。ペイロード内で識別値を保持する識別用プロパティの名前です。識別用プロパティは MAY 必須または任意として定義できますが、任意として定義する場合、Discriminator Object は識別プロパティが存在しない場合にモデルの構造を検証することが期待されるスキーマを指定する defaultMapping フィールドを MUST 含める必要があります。
mapping Map[string, string] ペイロードの値とスキーマ名または URI 参照との間のマッピングを保持するオブジェクトです。
defaultMapping string ペイロードに識別プロパティが存在しない、または明示的・暗黙的マッピングが存在しない値を含む場合にモデルの構造を検証することが期待されるスキーマ名またはスキーマへの URI 参照です。

このオブジェクトは MAY Specification Extensions によって拡張できます。

4.25.2 Discriminator Object を使用する条件

Discriminator Object は合成キーワードのいずれか(oneOfanyOfallOf)を使用している場合にのみ合法です。

oneOfanyOf の両方のユースケースでは、これらのキーワードが discriminator に隣接している場合、すべての可能なスキーマを明示的に列挙しなければなりません(MUST)。

冗長性を避けるために、discriminator を親スキーマ定義に追加し、親スキーマを allOf の構成で利用して構築されるすべてのスキーマを代替スキーマとして使用することが MAY あります。

allOf 形式の discriminator は検証以外のユースケースでのみ有用であることに注意してください;この形式の discriminator を持つ親スキーマによる検証は子スキーマを検索したり、検証に使用したりはしません。これは discriminator が検証結果を変更できないことと、親スキーマを子スキーマに結びつける標準的な JSON Schema キーワードが存在しないためです。

上記に記述されていない oneOfanyOfallOfdiscriminator の任意の構成の振る舞いは未定義です。

4.25.3 値をスキーマにマッピングするためのオプション

propertyName で指定されたプロパティの値は、該当する場合 Components Object の下のスキーマ名として使用されます。ただしその値に対して mapping が存在する場合は例外です。 mapping エントリは特定のプロパティ値を別のスキーマコンポーネント名、または URI で識別されるスキーマにマップします。 暗黙または明示のスキーマコンポーネント名を使用する場合、インラインの oneOfanyOf のサブスキーマは考慮されません。 mapping 値や defaultMapping 値が有効なスキーマ名と有効な相対 URI 参照の両方である場合の動作は実装依存ですが、スキーマ名として扱うことが RECOMMENDED です。 あいまいな値(例: "foo")をすべての実装で相対 URI 参照として扱いたい場合、作成者は "./foo" のように "." パスセグメントでプレフィックスする必要があります(MUST)。

マッピングキーは文字列値でなければなりません(MUST)。ただしツールは比較のためにレスポンス値を文字列に変換してもよい(MAY)ですが、そのような変換の正確な性質は実装依存です。

4.25.4 識別用プロパティの任意指定

識別用プロパティが任意として定義されている場合、Discriminator Object は、識別プロパティがペイロードに存在しないか、明示的または暗黙のマッピングがない値を含む場合にモデルの構造を検証することが期待されるスキーマを指定する defaultMapping フィールドを MUST 含める必要があります。これにより識別用プロパティが欠落していてもスキーマを正しく検証できます。

任意の識別用プロパティの主な使用例は、識別子を追加しても識別用プロパティを提供しない既存クライアントを壊さないようにスキーマを拡張できるようにすることです。

識別用プロパティが任意として定義される場合、識別プロパティの値を定義する各サブスキーマはそのプロパティを必須として定義することが重要です。なぜなら親スキーマによる強制がもはや働かないためです。

defaultMapping のスキーマは、識別用プロパティが存在するが明示的または暗黙のマッピングがない値を含む場合にもモデルの構造を検証することが期待されます。これは通常、defaultMapping スキーマで識別用プロパティのマッピングされた値を除外することで表現されます。例:

OtherPet:
  type: object
  properties:
    petType:
      not:
        enum: ['cat', 'dog']

これにより、oneOf を使ったポリモーフィズム記述で、識別用プロパティにマッピングされた値が含まれるペイロードに対して defaultMapping スキーマが検証してしまい検証失敗になることを防ぎます。

4.25.5

これらの例では、すべてのスキーマが 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 にマップされます。

4.26 XML オブジェクト

XML モデル定義をより細かく指定するためのメタデータオブジェクトです。 Schema Object を XML と共に使用する際、XML Object が存在しない場合の挙動は XML Object のデフォルトフィールド値によって決定されます。

4.26.1 固定フィールド

フィールド名 説明
nodeType string XML Node Types に記載のとおり、element, attribute, text, cdata, または none のいずれかです。$ref, $dynamicRef, または type: "array"Schema Object 内に存在する場合のデフォルト値は none、それ以外では element です。
name string スキーマに対応する要素/属性の名前を設定し、XML Node Names に記載の推論された名前を置き換えます。このフィールドは nodeTypetext, 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 によって拡張できます。

4.26.2 XML ノードタイプ

各 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 構成に有用です。

4.26.2.1 要素リストのモデリング

互換性の理由から、type: "array" のスキーマはデフォルトで nodeType: "none" となり、各配列アイテムのノードが親ノードの直下に配置されます。これは XML Node Names に定義された推論命名の振る舞いとも一致します。

リストを包む要素を生成するには、type: "array" スキーマに明示的に nodeType: "element" を設定してください。その際、ラップ要素またはアイテム要素のいずれかに明示的な名前を設定して、同じ推論名が両方に使われることを避けることを推奨します。期待される振る舞いの例を参照してください。

4.26.2.2 暗黙および明示の text ノード

もし element ノードがプリミティブ型を持つ場合、そのスキーマは、プロパティ名(または name フィールド)で命名された element ノードの内容を記述する暗黙の text ノードも生成します。

要素に属性と内容の両方がある場合は明示的な text ノードが必要です。

隣接して2つの text ノードを置くことは解析において曖昧であり、その結果の振る舞いは実装依存であることに注意してください。

4.26.3 XML ノード名

elementattribute のノードタイプは名前を必要とし、その名前は name フィールドでオーバーライドされない限り以下のようにスキーマから推論されなければなりません(MUST):

  • Components Objectschemas フィールド直下のスキーマの場合、コンポーネント名が推論名になります。
  • プロパティスキーマ、およびプロパティスキーマ下の配列アイテムスキーマの場合は、プロパティ名が推論名になります。
  • それ以外のケース(例:Media Type Objectschema フィールド下のインラインスキーマ)のように、推論できる名前がない場合は name フィールドを持つ XML Object が MUST 存在する必要があります。

配列を使用する場合、単数形と複数形の推論は行われないため、明示的に設定する必要があることに注意してください。

4.26.4 名前空間に関する制限

namespace フィールドは XML namespaces の構文に一致することを意図していますが、いくつか注意点があります:

  • この仕様のバージョン 3.1.0、3.0.3、およびそれ以前は誤って「absolute URI」という用語を使用しており(OAS v3.2.0 以降は「non-relative IRI」)、フラグメントを含む名前空間を使用する作成者はツールのサポートを注意深く確認するべきです。
  • XML は相対 IRI 参照を許容しますが推奨しませんが、本仕様はそれらを明確に禁止しています。

4.26.5 null 値の扱い

XML はデフォルトで null に相当する概念を持たないため、本仕様のバージョン 3.1.1 以前との互換性を保つために、null 値のシリアライズの挙動は実装依存です。

しかしながら、実装は次のように null 値を扱うことが SHOULD です:

  • 要素については xsi:nil="true" 属性を持つ空の要素を生成する。
  • 属性については属性を省略する。
  • テキストや CDATA セクションについては非テキスト値をテキストにシリアライズする議論を Appendix B で参照する。

属性に関しては、これにより null 値または欠落したプロパティのいずれも属性が省略される形でシリアライズされます。Schema Object はインメモリ表現を検証するため、これは null と必須プロパティの組み合わせの扱いを可能にします。しかし、属性として null を表す明確な方法がないため、属性プロパティは null を使うよりもオプショナルにすることが RECOMMENDED です。

正しいラウンドトリップ動作を確保するため、属性を省略する要素を解析する際、実装はスキーマがその値を許容する場合(例:type: ["number", "null"])に対応するプロパティを null に設定することを SHOULD、そうでなければプロパティを省略することを推奨します(例:type: "number")。

4.26.6 XML オブジェクトの例

Schema Objects の後に、そのスキーマから生成される例示的な XML 表現が続きます。attributewrapped を使った例については OpenAPI Specification バージョン 3.1 を参照してください。

4.26.6.1 XML Object がない場合

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>

基本的な文字列配列プロパティ(デフォルトで nodeTypenone):

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>
4.26.6.2 XML 名称の置換
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>
4.26.6.3 XML 属性、プレフィックス、および名前空間

ルート 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>
4.26.6.4 XML 配列

要素名の変更:

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 フィールドは、そのオブジェクトのデフォルト nodeTypenone であるため影響を与えません:

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>

明示的に nodeTypeelement に設定してラップ要素を作成する場合でも、名前が明示されていなければラップ要素とリストアイテム要素の両方に同じ名前が使用されます:

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>
4.26.6.5 属性とテキストを持つ要素
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>
4.26.6.6 CDATA を持つ参照要素

この例では、$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>
4.26.6.7 要素とテキストの順序制御

要素の正確な順序を制御するには 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>
4.26.6.8 XML と null

スキーマは 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>

4.27 セキュリティスキームオブジェクト

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 フローです。

4.27.1 固定フィールド

フィールド名 適用対象 説明
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 によって拡張できます。

4.27.2 セキュリティスキームオブジェクトの例

4.27.2.1 ベーシック認証の例
type: http
scheme: basic
4.27.2.2 API キーの例
type: apiKey
name: api-key
in: header
4.27.2.3 JWT ベアラーの例
type: http
scheme: bearer
bearerFormat: JWT
4.27.2.4 MutualTLS の例
type: mutualTLS
description: Cert must be signed by example.com CA
4.27.2.5 Implicit OAuth2 の例
type: oauth2
flows:
  implicit:
    authorizationUrl: https://example.com/api/oauth/dialog
    scopes:
      write:pets: modify pets in your account
      read:pets: read your pets

4.28 OAuth フローオブジェクト

サポートされる OAuth フローの設定を許可します。

4.28.1 固定フィールド

フィールド名 説明
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 によって拡張できます。

4.29 OAuth フローオブジェクト

サポートされる OAuth フローの設定の詳細

4.29.1 固定フィールド

フィールド名 適用対象 説明
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 によって拡張できます。

4.29.2 OAuth フローオブジェクトの例

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

4.30 セキュリティ要件オブジェクト

この操作を実行するために必要なセキュリティスキームの一覧。

各プロパティに使用される名前は、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 ({}) は匿名アクセスがサポートされることを示します。

4.30.1 パターンフィールド

フィールドパターン 説明
{name} [string] 各名前または URI は上で説明したセキュリティスキームに対応しなければなりません(MUST)。セキュリティスキームが "oauth2" または "openIdConnect" の場合、値は実行に必要なスコープ名のリストであり、認可が特定のスコープを要求しない場合はリストは空でもよい(MAY)。他のスキームタイプでは、配列は実行に必要なロール名のリストを含むことが MAY ありますが、それらは定義されていないか、帯域内で交換されるわけではありません。

4.30.2 セキュリティ要件オブジェクトの例

マルチドキュメントの OpenAPI 記述で Security Requirement Objects を使用する例については、付録 G: 解析と解決のガイダンス 内の Implicit Connection Resolution Examples も参照してください。

4.30.2.1 非 OAuth2 セキュリティ要件
api_key: []
4.30.2.2 OAuth2 セキュリティ要件

この例では Security Scheme にコンポーネント名を使用しています。

petstore_auth:
  - write:pets
  - read:pets
4.30.2.3 オプションの OAuth2 セキュリティ

この例では Security Scheme に相対 URI 参照を使用しています。

OpenAPI Object または Operation Object に定義されるようなオプションの OAuth2 セキュリティ例:

security:
  - {}
  - petstore_auth:
      - write:pets
      - read:pets

5. 仕様拡張

OpenAPI Specification はほとんどのユースケースに対応するように設計されていますが、特定の箇所で仕様を拡張するために追加データを付加することができます。

拡張プロパティは常に x- でプレフィックスされたパターン化フィールドとして実装されます。

Field Pattern Type Description
^x- Any OpenAPI スキーマへの拡張を許可します。フィールド名は MUSTx- で始まる必要があります(例: x-internal-id)。x-oai- および x-oas- で始まるフィールド名は OpenAPI Initiative によって定義された用途のために予約されています。値は任意の有効な JSON 値(null、プリミティブ、配列、もしくはオブジェクト)になり得ます。

OpenAPI Initiative はいくつかの extension registries を維持しており、個別の拡張キーワードや拡張キーワードの名前空間のためのレジストリも含まれます(例: individual extension keywords, extension keyword namespaces)。

拡張は仕様への追加提案の実現可能性を示す最良の方法の一つです。したがって、コミュニティの実験をサポートするために、実装は拡張性を念頭に設計することが RECOMMENDED です。

任意の拡張をサポートすることは OPTIONAL であり、ある拡張をサポートしているからといって他の拡張をサポートすることを意味するわけではありません。

6. セキュリティの考慮事項

6.1 OpenAPI記述フォーマット

OpenAPI Description は JSON、YAML、および JSON Schema の組み合わせを使用しており、それに伴うセキュリティ上の考慮事項を共有します:

6.2 ツールと利用シナリオ

さらに、OpenAPI Description はクライアントコード生成、ドキュメント生成、サーバ側のルーティング、API テストなど多目的のために多種多様なツールによって処理されます。OpenAPI Description の作成者は OpenAPI Description が使用され得るシナリオにおけるリスクを考慮しなければなりません。

6.3 セキュリティスキーム

OpenAPI Description は定義するリソースを保護するために使用されるセキュリティスキームを記述します。利用可能なセキュリティスキームは保護の度合いが異なります。データの機微性やセキュリティ侵害の潜在的影響などの要因が、API リソースに適用するセキュリティスキームの選択を導くべきです。既存の API との互換性のために basic auth や OAuth Implicit フローのようなスキームがサポートされることがありますが、OpenAPI にそれらが含まれていることは、それらの使用を推奨するものではありません。特に機微なデータや操作に対しては注意が必要です。

Security Requirement ObjectComponents Object 配下の Security Scheme Object に接続するルールには悪用され得る曖昧さがあります。具体的には:

6.4 セキュリティフィルタリング

OpenAPI Specification のいくつかのオブジェクトは宣言されても空のままにできたり、完全に削除され得ますが、それらは本来 API ドキュメントの中核を成すものです。

これはドキュメントに対する追加的なアクセス制御の層を許すための理由です。仕様自体の一部ではありませんが、特定のライブラリは認証/認可の形態に基づいてドキュメントの一部へのアクセスを制限することを選択することが MAY あります。

これの二つの例:

  1. Paths Object は存在するが空であることが MAY あります。直感に反するかもしれませんが、これは閲覧者に「正しい場所に到達したが、ドキュメントにアクセスできない」ことを示す場合があります。閲覧者は少なくとも認証に関する追加情報を含むかもしれない Info Object にはアクセスできるでしょう。
  2. Path Item Object は空であることが MAY あります。この場合、閲覧者はそのパスが存在することを認識しますが、その操作やパラメータを閲覧できません。これは Paths Object からパス自体を隠すのとは異なり、プロバイダが閲覧者に見せる内容を細かく制御できるようにします。

6.5 外部リソースの取り扱い

OpenAPI Description は、自動的にデリファレンスされる可能性のある外部リソースへの参照を含むことがあります。外部リソースは信頼できない別ドメインにホストされている場合があります。

6.6 参照循環の取り扱い

OpenAPI Description 内の参照は循環を引き起こす場合があります。ツールはリソース枯渇を防ぐために循環を検出し、適切に処理しなければなりません。

6.7 MarkdownおよびHTMLのサニタイズ

特定のフィールドは Markdown の使用を許可しており、Markdown 内にはスクリプトを含む HTML が含まれる可能性があります。Markdown を適切にサニタイズするのはツールの責任です。

A. 付録A: 改訂履歴

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

B. 付録B: データ型変換

型付きデータをプレーンテキストにシリアライズすることは、text/plain メッセージボディや multipart のパート、または URL クエリ文字列やメッセージボディ中の application/x-www-form-urlencoded フォーマットで発生し得ますが、これは実装またはアプリケーションによって大きく定義が異なります。

Schema ObjectsJSON Schema data model に基づいてデータを検証します。JSON Schema は文字列(ただし UTF-8 としてのみ広く相互運用可能 とされる)、数値、ブール、null の四つのプリミティブ型のみを認識します。特に整数は他の数値と区別される独立した型ではなく、type: "integer" は数学的に定義された便宜上のものです。

Parameter ObjectHeader Object、および Encoding Object は、配列やオブジェクト型の値をどのように配置するかを制御する機能を提供します。また、文字列を不正または予約文字から避けるためにさらにエンコードする方法を制御するためにも使用できます。しかし、スキーマ検証済みの非 UTF-8 プリミティブ型(または配列やオブジェクト全体)を文字列に変換するための汎用仕様は存在しません。

ただし二つのケースは標準に基づいた指針を提供します:

RFC6570 の実装はしばしば非文字列値の変換に独自の慣習を持ちますが、これは実装依存であり RFC 自体で定義されるものではありません。これが OpenAPI がこれらの変換を実装定義のままにしている理由の一つです:RFC6570 実装をそのまま使えるようにするためです。

数値、ブール、null(または RFC6570 が undefined と見なすその他の値)のシリアライズをより正確に制御するには、スキーマを type: "string" として定義し、patternenumformat などのキーワードでアプリケーションがスキーマ検証の前にデータをどのように事前変換すべきかを伝えることができます。結果として得られる文字列はそれ以上の型変換を必要としません。

format キーワードはシリアライズに役立ちます。いくつかのフォーマット(例:date-time)は曖昧さがありませんが、decimal のように明確でないものもあります。ただし、特定のフォーマットがすべての関連ツールでサポートされているか注意する必要があります。未認識のフォーマットは無視されます。

入力を事前フォーマットされた、スキーマ検証済みの文字列として要求することは、すべてのプログラミング言語や環境が同じデータ型をサポートしているわけではないため、ラウンドトリップの相互運用性を向上させます。

C. 付録C: RFC6570ベースのシリアライゼーションの利用

シリアライズは三つのシナリオで [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 を構築する必要があります。

C.1 フィールドとRFC6570演算子の対応関係

特定のフィールド値は 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 によって扱われる単一レベルを超える複合値の振る舞いを定めていないため、オブジェクトや配列を用いた場合に明確な振る舞いが指定されていないケースの結果は実装依存です。

C.2 パラメータ値の区切り文字

配列やオブジェクト値を結合するために style: "simple" で使われる , のような RFC6570 展開で使用される区切り文字は、allowReservedfalse の間は自動的にパーセントエンコードされます。RFC6570 は URI テンプレートに基づく変数を解析する方法を定めないため、ユーザはまず区切り文字で分割してから区切り文字を含む可能性のある値をパーセントデコードする前に分割を行う必要があります。

allowReservedtrue の場合、パーセントエンコード(区切りで結合する前)とパーセントデコード(区切りで分割した後)は適切なタイミングで手動で行う必要があります。

Appendix E は、区切り文字が含まれる style 値の取り扱いに関する追加ガイダンスを提供します。

C.3 RFC6570以外のフィールド値と組み合わせ

直接的な [RFC6570] に対応しない構成は RFC6570 に従って処理することが SHOULD です。実装は個々の名前や値のために RFC6570 の通常または予約展開(allowReserved に基づく)を使って適切に区切られた URI Template を作成することを MAY します。

これには次が含まれます:

Parameter Object の name フィールドは RFC6570 の variable name syntax よりもはるかに許容範囲が広いです。RFC6570 変数文字セット外の文字を含むパラメータ名は、URI Template で使用する前にパーセントエンコードされなければなりません(MUST)。

C.4

例えば、次のデータをフォームクエリ文字列で使いたいとします。ここで formulas は exploded され、words はされないものとします:

formulas:
  a: x+y
  b: x/y
  c: x^y
words:
- math
- is
- fun

C.4.1 RFC6570同等の展開

この 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

C.4.2 RFC6570非対応オプションによる展開

ここで(何らかの理由で)b の式内の / をクエリ文字列にそのまま現れるようにしたく、words を書き言葉のようにスペース区切りにしたいとします。そのために formulasallowReserved: 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.0words.1words.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 にエンコードされています。

C.4.3 未定義値と手動URIテンプレート構築

手動でテンプレートを構築する際には、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

C.4.4 不正な変数名としてのパラメータ名

この例では、ハートの絵文字は 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

D. 付録D: ヘッダーとCookieのシリアライズ

HTTP ヘッダは許容される文字や、許されない文字をどのようにエスケープして含めるかについて一貫性のない規則を持っています。quoted-string の ABNF ルール([RFC9110] の Section 5.4.6)は最も一般的なエスケープ方法ですが、普遍的に自動適用できるほど一般的ではありません。例えば、強い ETag"foo"(引用符を含む)で、弱い ETagW/"foo" のように見えます;この場合引用符内の内容も quoted-string の内容とは異なる扱いです。

このため、ParameterHeader オブジェクト経由でヘッダに渡されるデータは、OAS 実装に渡す前に引用符で囲みエスケープしておく必要があり、解析されたヘッダ値は引用符およびエスケープを含むことが期待されます。

D.1 パーセントエンコーディングとCookie

RFC6570 のパーセントエンコーディング挙動は in: "cookie" パラメータには常に適切とは限りません。パーセントエンコーディングはエスケープ手段として base64 エンコーディング(contentEncoding: “base64”)より一般的に見えますが、draft-ietf-httpbis-rfc6265bis-20 の section 5.6 は、Set-Cookie レスポンスヘッダでパーセントエンコードされているように見えるクッキーはクライアントによって保存時にデコードされてはならないと指摘しており、これはクライアントがそのストレージから取り出す際には既にエンコード済みであることを意味します。style: "cookie" の振る舞いはこの使用を前提としており、パーセントエンコードを適用したり解除したりしません。

自動パーセントエンコーディングが望ましい場合、プリミティブ値または非デフォルトの explode: false を使用した style: "form" がこの挙動を提供します。しかし style: "form" のデフォルトである explode: true はクッキー用の区切り(; と 1 スペース)ではなく & を使用するため、複数のクッキー値を設定するのには不適切です。RFC6570 実装を通じて style: "form"in: "cookie" を使用するには ? プレフィックスを削除する必要があります。style: "form"in: "cookie" と完全に使うには allowReserved フィールドを使ってください。

E. 付録 E: パーセントエンコーディングとフォームメディアタイプ

注意: 本節では可読性のために application/x-www-form-urlencodedmultipart/form-data のメディアタイプをそれぞれ form-urlencoded および form-data と略記します。

パーセントエンコーディングは URI および URI から文法を派生させたメディアタイプで使用されます。 パーセントエンコーディングの基本的なルールは次のとおりです:

この付録の残りは上記のルールに基づく詳細なガイダンスを提供します。

E.1 パーセントエンコーディングの文字クラス

この処理は三つの文字クラスに関係しており、仕様によって呼び方は異なりますが、本節の目的のために次のように定義します:

特に指定がない限り、本節では RFC3986 の reservedunreserved の定義を使用し、unsafe セットはそれら両方に含まれないすべての文字として定義します。

E.2 パーセントエンコーディングと form-urlencoded

各 URI コンポーネント(クエリ文字列など)は、いくつかの予約文字を安全ではないものと見なします。これはそれらがコンポーネント間のデリミタとして機能するため(例:#)、または([] の場合のように)歴史的にグローバルに安全でないと見なされ後に限定的な目的で予約されたためです。

コンポーネント内で特別な意味が定義されていない予約文字は未エンコードのまま残すことができます。しかし、他の仕様が特別な意味を定義することがあり、その場合は追加の特別な意味の外側ではその文字をパーセントエンコードすることが求められます。

form-urlencoded メディアタイプは区切り記号としての =&、および空白の代替としての +%20 の代わり)に対して特別な意味を定義します。 これは、これら三つの文字が RFC3986 によってクエリ文字列で予約されつつ許可されている一方で、form-urlencoded のクエリ文字列ではそれらが form-urlencoded の用途で使われる場合を除きパーセントエンコードされなければならないことを意味します;付録 C を参照してください。

E.3 パーセントエンコーディングと form-data

[RFC7578] の Section 2 は、ファイル名などのパートヘッダに含まれるテキストベースのデータを ASCII 文字集合に収める手段として RFC3986 に基づくパーセントエンコーディングを提案しています。 この提案は 2015 年以前の(古い)form-data に関する仕様の一部ではなかったため、相互運用性を確保するために注意が必要です。 パーセントエンコーディングをこの方法で使用したい場合、ユーザはデータを事前にパーセントエンコードした形で提供することを MUST します。なぜなら、このメディアタイプではどの Encoding Object フィールドが使われても自動的にパーセントエンコーディングが適用されることはないからです。

form-data メディアタイプはそのパートに任意のテキストまたはバイナリデータを許容するため、一般にはパーセントエンコーディングや類似のエスケープは必要ありません。

E.4 URI と form-urlencoded 文字列の生成および検証

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 Objectschema が存在する場合、また Encoding Objectstyle, explode, または allowReserved のいずれかが存在する場合に使用されます。 付録 C を参照すると、RFC6570 の 2 種類のパーセントエンコーディングアプローチや + に関する例の詳細が得られます。

コンテンツベースのシリアライズは Media Type Object によって定義され、Parameter ObjectHeader Objectcontent フィールドが存在する場合に使用され、また Encoding Object では contentType フィールドに基づいて style, explode, allowReserved が存在しない場合に使用されます。 URI で使用する場合、各部分はメディアタイプ(例:text/plainapplication/json)に基づいてエンコードされ、その後 form-urlencoded 文字列やその他の URL コンポーネントでの一般的な URI 使用のためにパーセントエンコードされなければなりません(メディアタイプが既に URI パーセントエンコーディングを取り込んでいる場合を除く)。

E.4.1 歴史的仕様との相互運用性

この仕様の以前のバージョンは RFC1866 とその RFC1738 に基づくパーセントエンコーディング規則を要求していました。 WHATWG-URL の form-urlencoded 規則はこのメディアタイプに関する現在のブラウザ間での合意を表し、RFC1866 における RFC1738 の不明瞭な言い換えが導入したあいまいさを回避します。

RFC1866/RFC1738 との整合性が必要なユーザは、自身のツールやライブラリの挙動を注意深く確認することを推奨します。

E.4.2 ウェブブラウザ環境との相互運用性

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 を参照してください。

E.5 URI と form-urlencoded 文字列のデコード

パーセントデコードアルゴリズムは、どの文字がパーセントデコードされたかに依存しないため、任意の仕様に従ってパーセントエンコードされた URI は正しくデコードされます。

同様に、すべての form-urlencoded デコードアルゴリズムはパーセントデコードアルゴリズムに対して + を空白に扱う処理を加えたものに過ぎず、エンコード仕様に依らず動作します。

しかしながら、+ が空白を表す場合は form-urlencoded デコードを使用し、+ がリテラルのプラス記号を表す場合は通常のパーセントデコードを使用するなど、適切なデコードを用いることに注意が必要です。

E.6 パーセントエンコーディングと不正または予約された区切り文字

[, ], | および空白文字は、それぞれ deepObjectpipeDelimited、および spaceDelimited スタイルの区切り文字として使用されますが、これらはいずれも RFC3986 に準拠するために MUST パーセントエンコードされなければなりません。 これにより、これらのスタイルを使用する際にはパラメータ名や値において区切り用途と区別するために事前に文字を別の方法でエンコードしておく必要があります。

空白文字は常に違法であり、関連するすべての標準の実装によって何らかの方法でエンコードされます。 パラメータ名や値の空白を spaceDelimited の区切り(%20)と区別するために +form-urlencoded の慣例)を使うこともできますが、仕様はデコードを一回のパスとして定義しているため、非標準の解析アルゴリズムを用いない限りデコード後の結果から用途の違いを区別することはできません。 そのような非標準の解析方法はすべてのツール間で相互運用可能ではありません。

一部の環境では [, ], そして場合によっては | をクエリ文字列で未エンコードのまま使用しても問題がないように見えることがあります。 WHATWG の汎用クエリ文字列規則は非 form-urlencoded のクエリ文字列ではこれらの文字のパーセントエンコードを要求しませんが、有効な URL の Unicode コードポイントの集合からはそれらを除外しています。 これらの区切り文字を未エンコードのままにしつつ名前と値の内部では通常のパーセントエンコーディングを使用するコードは、すべての実装間で相互運用可能であるとは保証されません。

最大の相互運用性を得るためには、これらのスタイルを使用する際に区切り文字をパーセントエンコードすると同時に追加のエスケープ規約を定義して文書化するか、あるいはこれらのスタイル自体を避けることが RECOMMENDED です。 追加のエンコード/エスケープの正確な方法は API 設計者に委ねられており、本仕様の記述するシリアライズとエンコーディングの手順の前に実行され、逆手順で元に戻されることが期待されます。これにより、その処理は本仕様で管理されるプロセスの外に置かれます。

F. 付録 F: 基底 URI の決定と参照解決の例

本節は四つの可能な基底 URI の各々の出所を示し、その後に相対の $self$id を含む例を示します。

F.1 コンテンツ内の基底 URI

リソースのコンテンツ内の基底 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)に対してではないためです。

F.2 カプセル化エンティティからの基底 URI

コンテンツ内で基底 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 Objecturl フィールドは Content-Location の基底 URI に対して解決され、https://example.com/api/docs.html を生成し、これは第三のパートの Content-Location と一致します。

F.3 取得 URI からの基底 URI

前のどちらの出所からも基底 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 になります。

F.4 アプリケーション特有の既定基底 URI

$self やカプセル化エンティティ、取得 URI を持たないメモリ内の OpenAPI ドキュメントを構築する場合、アプリケーションは断片のみの内部参照を解決するためにデフォルト基底 URI を仮定することができます([RFC3986] の Section 5.1.4)。 このような内部解決は実際には基底 URI を選ばずに行うことも可能ですが、ランダムに生成された UUID を含む URN(例:urn:uuid:f26cdaad-3193-4398-a838-4ecb7326c4c5)のような基底 URI を選ぶと特別扱いとして実装する必要がなくなります。

F.5 相対的な $self$id の解決

本付録の最初の例を再検討しますが、今回は $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 となり、最初のドキュメントの $selfhttps://staging.example.com/openapi、第二のドキュメントの $selfhttps://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(ローカル開発))でも動作します。

G. 付録 G: 解析と解決のガイダンス

実装は全文ドキュメントの解析を次のいずれかの方法でサポートしてもよい(MAY):

ルートが OpenAPI Object や Schema Object 以外のオブジェクトであるドキュメントをサポートするために追加のメカニズムを使用することもできますが、その結果の振る舞いは実装依存であることに注意してください:

G.1 断片的解析に関する警告

参照された OpenAPI コンテンツの断片を含む部分だけを、その含むドキュメントの残りの内容を考慮せずに解析する実装は、参照対象の意味や振る舞いを変えるキーワードを見落とすことになります。特に、基底 URI を変えるキーワードを考慮しないと参照が意図しない URI に解決され、予測不能な結果をもたらすことでセキュリティリスクを招きます。 過去バージョンの要件のためにこの種の解析をサポートする実装がある一方で、バージョン 3.1 以降では、断片を単独で解析した結果は 未定義 であり、本仕様の要件と矛盾する可能性が高いことに注意してください。

参照断片のみを解析した場合に正しく動作するように OpenAPI 記述を構成することは可能ですが、それに依存することは RECOMMENDED されません。本仕様はそのような振る舞いが安全である条件を明示的に列挙せず、将来のバージョンでの継続的な安全性を保証しません。

G.2 フィールド型と参照文脈の衝突

OAD 内の JSON または YAML オブジェクトは、そのコンテキストに基づいて特定のオブジェクト(Operation Objects, Response Objects, Reference Objects など)として解釈されます。参照の配置方法によっては、ある JSON/YAML オブジェクトが複数の異なる文脈で解釈され得ます:

同じ JSON/YAML オブジェクトが複数回解析され、各文脈がそれを 異なる オブジェクト型として解析することを要求する場合、その結果の振る舞いは実装依存であり、検出されればエラー扱いとすることが MAY あります。 例としては、Path Item Object が期待される場所に #/components/schemas の下の空の Schema Object を参照する場合があり、空のオブジェクトは両方の型に対して有効です。最大の相互運用性のために、OpenAPI 記述の作成者はそのようなシナリオを避けることが RECOMMENDED です。

G.3 暗黙的接続に関するガイダンス

次のオブジェクトとフィールドは暗黙的接続の使用を含みます:

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 のような外部ソリューションの使用を検討することが推奨されます。

G.3.1 暗黙的接続の解決例

本節は 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 の解決は実装依存の振る舞いを持ち得ますが、本節はツールがエントリドキュメントからコンポーネント名を解決することを正式に推奨しています。すべての実装依存の振る舞いと同様に、どの振る舞いがサポートされているかを判断するためにツールのドキュメントを確認することが重要です。

H. 参照文献

H.1 規範的参照

[ABNF]
Augmented BNF for Syntax Specifications: ABNF。D. Crocker(編); P. Overell。IETF。2008年1月。インターネット標準。URL:https://www.rfc-editor.org/rfc/rfc5234
[CommonMark]
CommonMark Spec。URL:https://spec.commonmark.org/
[CommonMark-0.27]
CommonMark Spec, Version 0.27。John MacFarlane。2016年11月18日。URL:https://spec.commonmark.org/0.27/
[DOM]
DOM Standard。Anne van Kesteren。WHATWG。 Living Standard。URL:https://dom.spec.whatwg.org/
[IANA-HTTP-AUTHSCHEMES]
Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry。IANA。URL:https://www.iana.org/assignments/http-authschemes/
[IANA-HTTP-STATUS-CODES]
Hypertext Transfer Protocol (HTTP) Status Code Registry。IANA。URL:https://www.iana.org/assignments/http-status-codes/
[OpenAPI-Registry]
OpenAPI Initiative Registry。OpenAPI Initiative。URL:https://spec.openapis.org/registry/index.html
[OpenID-Connect-Core]
OpenID Connect Core 1.0 incorporating errata set 2。N. Sakimura; J. Bradley; M. Jones; B. de Medeiros; C. Mortimore。OpenID Foundation。2023年12月15日。最終版。URL:https://openid.net/specs/openid-connect-core-1_0.html
[OpenID-Connect-Discovery]
OpenID Connect Discovery 1.0 incorporating errata set 2。N. Sakimura; J. Bradley; M. Jones; E. Jay。OpenID Foundation。2023年12月15日。最終版。URL:https://openid.net/specs/openid-connect-discovery-1_0.html
[RFC2046]
Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types。N. Freed; N. Borenstein。IETF。1996年11月。ドラフト標準。URL:https://www.rfc-editor.org/rfc/rfc2046
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels。S. Bradner。IETF。1997年3月。現行の最良慣行。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC3986]
Uniform Resource Identifier (URI): Generic Syntax。T. Berners-Lee; R. Fielding; L. Masinter。IETF。2005年1月。インターネット標準。URL:https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
Internationalized Resource Identifiers (IRIs)。M. Duerst; M. Suignard。IETF。2005年1月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc3987
[RFC4648]
The Base16, Base32, and Base64 Data Encodings。S. Josefsson。IETF。2006年10月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc4648
[RFC6265]
HTTP State Management Mechanism。A. Barth。IETF。2011年4月。提案標準。URL:https://httpwg.org/specs/rfc6265.html
[RFC6570]
URI Template。J. Gregorio; R. Fielding; M. Hadley; M. Nottingham; D. Orchard。IETF。2012年3月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc6570
[RFC6749]
The OAuth 2.0 Authorization Framework。D. Hardt(編)。IETF。2012年10月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc6749
[RFC6901]
JavaScript Object Notation (JSON) Pointer。P. Bryan(編);K. Zyp;M. Nottingham(編)。IETF。2013年4月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc6901
[RFC7578]
Returning Values from Forms: multipart/form-data。L. Masinter。IETF。2015年7月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc7578
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words。B. Leiba。IETF。2017年5月。現行の最良慣行。URL:https://www.rfc-editor.org/rfc/rfc8174
[RFC8259]
The JavaScript Object Notation (JSON) Data Interchange Format。T. Bray(編)。IETF。2017年12月。インターネット標準。URL:https://www.rfc-editor.org/rfc/rfc8259
[RFC8414]
OAuth 2.0 Authorization Server Metadata。M. Jones; N. Sakimura; J. Bradley。IETF。2018年6月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc8414
[RFC8628]
OAuth 2.0 Device Authorization Grant。W. Denniss; J. Bradley; M. Jones; H. Tschofenig。IETF。2019年8月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc8628
[RFC9110]
HTTP Semantics。R. Fielding(編), M. Nottingham(編), J. Reschke(編)。IETF。2022年6月。インターネット標準。URL:https://httpwg.org/specs/rfc9110.html
[RFC9264]
Linkset: Media Types and a Link Relation Type for Link Sets。E. Wilde; H. Van de Sompel。IETF。2022年7月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc9264
[RFC9512]
YAML Media Type。R. Polli; E. Wilde; E. Aro。IETF。2024年2月。情報提供。URL:https://www.rfc-editor.org/rfc/rfc9512
[SNIFF]
MIME Sniffing Standard。Gordon P. Hemsley。WHATWG。Living Standard。URL:https://mimesniff.spec.whatwg.org/
[SPDX-Licenses]
SPDX License List。Linux Foundation。URL:https://spdx.org/licenses/
[WHATWG-URL]
URL Standard。Anne van Kesteren。WHATWG。 Living Standard。URL:https://url.spec.whatwg.org/
[xml-names11]
Namespaces in XML 1.1 (Second Edition)。Tim Bray; Dave Hollander; Andrew Layman; Richard Tobin ほか。W3C。2006年8月16日。W3C勧告。URL:https://www.w3.org/TR/xml-names11/
[YAML]
YAML Ain’t Markup Language (YAML™) Version 1.2。Oren Ben-Kiki; Clark Evans; Ingy döt Net。2009年10月1日。URL:http://yaml.org/spec/1.2/spec.html

H.2 参考文献(情報的参照)

[HTML]
HTML Standard。Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters。WHATWG。Living Standard。URL:https://html.spec.whatwg.org/multipage/
[HTML401]
HTML 4.01 Specification。Dave Raggett; Arnaud Le Hors; Ian Jacobs。W3C。2018年3月27日。W3C勧告。URL:https://www.w3.org/TR/html401/
[OpenAPI-Learn]
OpenAPI - Getting started, and the specification explained。OpenAPI Initiative。URL:https://learn.openapis.org/
[RFC1738]
Uniform Resource Locators (URL)。 T. Berners-Lee; L. Masinter; M. McCahill。IETF。1994年12月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc1738
[RFC1866]
Hypertext Markup Language - 2.0。 T. Berners-Lee; D. Connolly。IETF。1995年11月。履歴的仕様。URL:https://www.rfc-editor.org/rfc/rfc1866
[RFC2396]
Uniform Resource Identifiers (URI): Generic Syntax。T. Berners-Lee; R. Fielding; L. Masinter。IETF。1998年8月。ドラフト標準。URL:https://www.rfc-editor.org/rfc/rfc2396
[RFC2557]
MIME Encapsulation of Aggregate Documents, such as HTML (MHTML)。J. Palme; A. Hopmann; N. Shelness。IETF。1999年3月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc2557
[RFC6838]
Media Type Specifications and Registration Procedures。N. Freed; J. Klensin; T. Hansen。IETF。2013年1月。現行の最良慣行。URL:https://www.rfc-editor.org/rfc/rfc6838
[RFC7464]
JavaScript Object Notation (JSON) Text Sequences。N. Williams。IETF。2015年2月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc7464
[RFC8091]
A Media Type Structured Syntax Suffix for JSON Text Sequences。E. Wilde。IETF。2017年2月。情報提供。URL:https://www.rfc-editor.org/rfc/rfc8091
[RFC9535]
JSONPath: Query Expressions for JSON。S. Gössner(編);G. Normington(編);C. Bormann(編)。IETF。2024年2月。提案標準。URL:https://www.rfc-editor.org/rfc/rfc9535