Skip to content

Commit 71b9436

Browse files
committed
Improved examples
Including fixing a bug in one of the URIs.
1 parent fb0a559 commit 71b9436

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

src/oas.md

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4937,19 +4937,36 @@ In the `other` document, the referenced path item has a Security Requirement for
49374937
A base URI within the resource's content (RFC3986 Section 5.1.1) is the highest-precedence source of a base URI.
49384938
For OpenAPI Documents, this source is the OpenAPI Object's `$self` field, while for Schema Objects that contain a `$id`, or are a subschema of a Schema Object containing a `$id`, the source is the `$id` field:
49394939

4940+
Assume the retrieval URI of the following document is `file://home/someone/src/api/openapi.yaml`:
4941+
49404942
```YAML
49414943
openapi: 3.2.0
4942-
$self: https://example.com/openapi
4944+
$self: https://example.com/api/openapi
49434945
info:
49444946
title: Example API
49454947
version: 1.0
4948+
paths:
4949+
/foo:
4950+
get:
4951+
requestBody:
4952+
$ref: "shared#/components/requestBodies/Foo"
4953+
```
4954+
4955+
Assume the retrieval URI for the following document is `https://git.example.com/shared/blob/main/shared/foo.yaml`:
4956+
4957+
```YAML
4958+
openapi: 3.2.0
4959+
$self: https://example.com/api/shared/foo
4960+
info:
4961+
title: Shared components for all APIs
4962+
version: 1.0
49464963
components:
49474964
requestBodies:
49484965
Foo:
49494966
content:
49504967
application/json:
49514968
schema:
4952-
$ref: schemas/foo
4969+
$ref: ../schemas/foo
49534970
schemas:
49544971
Foo:
49554972
$id: https://example.com/api/schemas/foo
@@ -4961,7 +4978,12 @@ components:
49614978
type: string
49624979
```
49634980

4964-
In the example above, the `$ref` in the Request Body Object is resolved using `$self` as the base URI, producing `https://example.com/schemas/foo`.
4981+
In this example, the retrieval URIs are irrelevant because both documents define `$self`.
4982+
4983+
For the relative `$ref` in the first document, it is resolved against `$self` to produce `https://example.com/shared/foo#/components/requestBodies/Foo`.
4984+
The portion of that URI before the '#' matches the `$self` of the second document, so the reference target is resolved to `#/components/requestBodies/Foo` in that second document.
4985+
4986+
In that document, the `$ref` in the Request Body Object is resolved using that document's `$self` as the base URI, producing `https://example.com/schemas/foo`.
49654987
This matches the `$id` at `#/components/schemas/Foo/$id` so it points to that Schema Object.
49664988
That Schema Object has a subschema with `$ref: bar`, which is resolved against the `$id` to produce `https://example.com/schemas/bar`, which matches the `$id` at `#/components/schemas/Bar/$id`.
49674989

@@ -4971,7 +4993,6 @@ Therefore it is RECOMMENDED that OAD authors use `$id` values to reference such
49714993

49724994
Note also that it is impossible for the reference at `#/components/schemas/Foo/properties/bar/$ref` to reference the schema at `#/components/schemas/Bar` using a JSON Pointer, as the JSON Pointer would be resolved relative to `https://example.com/schemas/foo`, not to the OpenAPI Document's base URI from `$self`.
49734995

4974-
49754996
### Base URI From Encapsulating Entity
49764997

49774998
If no base URI can be determined within the content, the next location to search is any encapsulating entity (RFC3986 Section 5.1.2).
@@ -4980,6 +5001,8 @@ This is common for Schema Objects encapsulated within an OpenAPI Document.
49805001
An example of an OpenAPI Document itself being encapsulated in another entity would be a `multipart/related` archive ([[?RFC2557]]), such as the following `multipart/related; boundary="boundary-example"; type="application/openapi+yaml"` document.
49815002
Note that this is purely an example, and support for such multipart documents or any other format that could encapsulate an OpenAPI Document is not a requirement of this specification.
49825003

5004+
RFC2557 was written to allow sending hyperlinked sets of documents as email attachments, in which case there would not be a retrieval URI for the multipart attachment (although the format could also be used in HTTP as well).
5005+
49835006
```MULTIPART
49845007
--boundary-example
49855008
Content-Type: application/openapi+yaml
@@ -5027,7 +5050,7 @@ Content-Location: https://example.com/api/docs.html
50275050

50285051
In this example, the URI for each part, which also serves as its base URI, comes from the part's `Content-Location` header as specified by RFC2557.
50295052
Since the Schema Object at `#/components/schemas/Foo` does not contain an `$id`, the reference in its subschema uses the OpenAPI Document's base URI, which is taken from the `Content-Location` header of its part within the `multipart/related` format.
5030-
The resulting reference to `https://example.com/schemas/bar` matches the `Content-Location` header of the second part, which allows the reference target to be located within the multipart archive.
5053+
The resulting reference to `https://example.com/schemas/bar` matches the `Content-Location` header of the second part, which according to RFC2557 allows the reference target to be located within the multipart archive.
50315054

50325055
Similarly, the `url` field of the [External Documentation Object](#external-documentation-object) is resolved against the base URI from `Content-Location`, producing `https://example.com/api/docs.html` which matches the `Content-Location` of the third part.
50335056

0 commit comments

Comments
 (0)