You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/oas.md
+28-5Lines changed: 28 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -4937,19 +4937,36 @@ In the `other` document, the referenced path item has a Security Requirement for
4937
4937
A base URI within the resource's content (RFC3986 Section 5.1.1) is the highest-precedence source of a base URI.
4938
4938
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:
4939
4939
4940
+
Assume the retrieval URI of the following document is `file://home/someone/src/api/openapi.yaml`:
4941
+
4940
4942
```YAML
4941
4943
openapi: 3.2.0
4942
-
$self: https://example.com/openapi
4944
+
$self: https://example.com/api/openapi
4943
4945
info:
4944
4946
title: Example API
4945
4947
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
4946
4963
components:
4947
4964
requestBodies:
4948
4965
Foo:
4949
4966
content:
4950
4967
application/json:
4951
4968
schema:
4952
-
$ref: schemas/foo
4969
+
$ref: ../schemas/foo
4953
4970
schemas:
4954
4971
Foo:
4955
4972
$id: https://example.com/api/schemas/foo
@@ -4961,7 +4978,12 @@ components:
4961
4978
type: string
4962
4979
```
4963
4980
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`.
4965
4987
This matches the `$id` at `#/components/schemas/Foo/$id` so it points to that Schema Object.
4966
4988
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`.
4967
4989
@@ -4971,7 +4993,6 @@ Therefore it is RECOMMENDED that OAD authors use `$id` values to reference such
4971
4993
4972
4994
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`.
4973
4995
4974
-
4975
4996
### Base URI From Encapsulating Entity
4976
4997
4977
4998
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.
4980
5001
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.
4981
5002
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.
4982
5003
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).
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.
5029
5052
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.
5031
5054
5032
5055
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.
0 commit comments