diff options
Diffstat (limited to 'doc/rfc/rfc9264.txt')
-rw-r--r-- | doc/rfc/rfc9264.txt | 1490 |
1 files changed, 1490 insertions, 0 deletions
diff --git a/doc/rfc/rfc9264.txt b/doc/rfc/rfc9264.txt new file mode 100644 index 0000000..82b9bc1 --- /dev/null +++ b/doc/rfc/rfc9264.txt @@ -0,0 +1,1490 @@ + + + + +Internet Engineering Task Force (IETF) E. Wilde +Request for Comments: 9264 Axway +Category: Standards Track H. Van de Sompel +ISSN: 2070-1721 Data Archiving and Networked Services + July 2022 + + + Linkset: Media Types and a Link Relation Type for Link Sets + +Abstract + + This specification defines two formats and associated media types for + representing sets of links as standalone documents. One format is + based on JSON, and the other is aligned with the format for + representing links in the HTTP "Link" header field. This + specification also introduces a link relation type to support the + discovery of sets of links. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9264. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Terminology + 3. Use Cases and Motivation + 3.1. Third-Party Links + 3.2. Challenges Writing to the HTTP "Link" Header Field + 3.3. Large Number of Links + 4. Document Formats for Sets of Links + 4.1. HTTP Link Document Format: application/linkset + 4.2. JSON Document Format: application/linkset+json + 4.2.1. Set of Links + 4.2.2. Link Context Object + 4.2.3. Link Target Object + 4.2.4. Link Target Attributes + 4.2.5. JSON Extensibility + 5. The "profile" Parameter for Media Types to Represent Sets of + Links + 6. The "linkset" Relation Type for Linking to a Set of Links + 7. Examples + 7.1. Set of Links Provided as "application/linkset" + 7.2. Set of Links Provided as "application/linkset+json" + 7.3. Discovering a Link Set via the "linkset" Link Relation Type + 7.4. Link Set Profiles + 7.4.1. Using a "profile" Attribute with a "linkset" Link + 7.4.2. Using a "profile" Parameter with a Link Set Media Type + 7.4.3. Using a Link with a "profile" Link Relation Type + 8. IANA Considerations + 8.1. Link Relation Type: linkset + 8.2. Media Type: application/linkset + 8.3. Media Type: application/linkset+json + 9. Security Considerations + 10. References + 10.1. Normative References + 10.2. Informative References + Appendix A. JSON-LD Context + Acknowledgements + Authors' Addresses + +1. Introduction + + Resources on the Web often use typed Web Links [RFC8288], either + (1) embedded in resource representations -- for example, using the + <link> element for HTML documents or (2) conveyed in the HTTP "Link" + header field for documents of any media type. In some cases, + however, providing links in this manner is impractical or impossible, + and delivering a set of links as a standalone document is preferable. + + Therefore, this specification defines two formats for representing + sets of Web Links and their attributes as standalone documents. One + serializes links in the same format as the format used in the HTTP + "Link" header field, and the other serializes links in JSON. It also + defines associated media types to represent sets of links, and the + "linkset" relation type to support the discovery of any resource that + conveys a set of links as a standalone document. + +2. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + This specification uses the terms "link context" and "link target" in + the same manner that "Web Linking" [RFC8288] uses them. + + In the examples provided in this document, links in the HTTP "Link" + header field are shown on separate lines in order to improve + readability. Note, however, that as per Section 5.5 of "HTTP + Semantics" [RFC9110], line breaks are deprecated in values for HTTP + fields; only whitespaces and tabs are supported as separators. + +3. Use Cases and Motivation + + The following sections describe use cases in which providing links by + means of a standalone document instead of in an HTTP "Link" header + field or as links embedded in the resource representation is + advantageous or necessary. + + For all scenarios, links could be provided by means of a standalone + document that is formatted according to the JSON-based serialization, + the serialization aligned with the HTTP "Link" field format, or both. + The former serialization is motivated by the widespread use of JSON + and related tools, which suggests that handling sets of links + expressed as JSON documents should be attractive to developers. The + latter serialization is provided for compatibility with the existing + serialization used in the HTTP "Link" field and to allow the reuse of + tools created to handle it. + + It is important to keep in mind that when providing links by means of + a standalone representation, other links can still be provided using + other approaches, i.e., it is possible to combine various mechanisms + to convey links. + +3.1. Third-Party Links + + In some cases, it is useful that links pertaining to a resource are + provided by a server other than the one that hosts the resource. For + example, this allows: + + * Providing links in which the resource is involved not just as a + link context but also as a link target, with a different resource + being the link context. + + * Providing links pertaining to the resource that the server hosting + that resource is not aware of. + + * External management of links pertaining to the resource in a + special-purpose link management service. + + In such cases, links pertaining to a resource can be provided by + another, specific resource. That specific resource may be managed, + by the same custodian or by another custodian, as the resource to + which the links pertain. For clients intent on consuming links + provided in that manner, it would be beneficial if the following + conditions were met: + + * Links are provided in a document that uses a well-defined media + type. + + * The resource to which the provided links pertain is able to link + to the resource that provides these links using a well-known link + relation type. + + These requirements are addressed in this specification through the + definition of two media types and a link relation type, respectively. + +3.2. Challenges Writing to the HTTP "Link" Header Field + + In some cases, it is not straightforward to write links to the HTTP + "Link" header field from an application. This can, for example, be + the case because not all required link information is available to + the application or because the application does not have the + capability to directly write HTTP fields. In such cases, providing + links by means of a standalone document can be a solution. Making + the resource that provides these links discoverable can be achieved + by means of a typed link. + +3.3. Large Number of Links + + When conveying links in an HTTP "Link" header field, it is possible + for the size of the HTTP response fields to become unpredictable. + This can be the case when links are determined dynamically in a + manner dependent on a range of contextual factors. It is possible to + statically configure a web server to correctly handle large HTTP + response fields by specifying an upper bound for their size. But + when the number of links is unpredictable, estimating a reliable + upper bound is challenging. + + Section 15 of "HTTP Semantics" [RFC9110] defines error codes related + to excess communication by the user agent ("413 Content Too Large" + and "414 URI Too Long"), but no specific error codes are defined to + indicate that response field content exceeds the upper bound that can + be handled by the server and thus has been truncated. As a result, + applications take countermeasures aimed at controlling the size of + the HTTP "Link" header field -- for example, by limiting the links + they provide to those with select relation types, thereby limiting + the value of the HTTP "Link" header field to clients. Providing + links by means of a standalone document overcomes challenges related + to the unpredictable (to the web server implementation) nature of the + size of HTTP "Link" header fields. + +4. Document Formats for Sets of Links + + This section specifies two document formats to convey a set of links. + Both are based on the abstract model specified in Section 2 of "Web + Linking" [RFC8288], which defines a link as consisting of a "link + context", a "link relation type", a "link target", and optional + "target attributes": + + * The format defined in Section 4.1 is nearly identical to the field + value of the HTTP "Link" header field as specified in Section 3 of + [RFC8288]. + + * The format defined in Section 4.2 is expressed in JSON [RFC8259]. + + Links provided in the HTTP "Link" header field are intended to be + used in the context of an HTTP interaction, and contextual + information that is available during an interaction is used to + correctly interpret them. Links provided in link sets, however, can + be reused outside of an HTTP interaction, when no such contextual + information is available. As a result, implementers of link sets + should strive to make them self-contained by adhering to the + following recommendations. + + For links provided in the HTTP "Link" header field that have no + anchor or that use relative references, the URI of the resource that + delivers the links provides the contextual information that is needed + for their correct interpretation. In order to support use cases + where link set documents are reused outside the context of an HTTP + interaction, it is RECOMMENDED to make them self-contained by + adhering to the following guidelines: + + * For every link provided in the set of links, explicitly provide + the link context using the "anchor" attribute. + + * For the link context ("anchor" attribute) and link target ("href" + attribute), use URI references that are not relative references + (as defined in Section 4.1 of [RFC3986]). + + If these recommendations are not followed, the interpretation of + links in link set documents will depend on which URI is used as the + context. + + For a "title" attribute provided on a link in the HTTP "Link" header + field, the language in which the title is expressed is provided by + the "Content-Language" header field of the HTTP interaction with the + resource that delivers the links. This does not apply to "title" + attributes provided for links in link set documents because that + would constrain all links in a link set to having a single title + language and would not support determining title languages when a + link set is used outside of an HTTP interaction. In order to support + use cases where link set documents are reused outside the context of + an HTTP interaction, it is RECOMMENDED to make them self-contained by + using the "title*" attribute instead of the "title" attribute because + "title*" allows expressing the title language as part of its value by + means of a language tag. Note that, in this regard, language tags + are matched case insensitively (see Section 2.1.1 of [RFC5646]). If + this recommendation is not followed, accurately determining the + language of titles provided on links in link set documents will not + be possible. + + Note also that Section 3.3 of [RFC8288] deprecates the "rev" + construct that was provided by [RFC5988] as a means to express links + with a directionality that is the inverse of direct links that use + the "rel" construct. In both serializations for link sets defined + here, inverse links may be represented as direct links using the + "rel" construct and by switching the roles of the resources involved + in the link. + +4.1. HTTP Link Document Format: application/linkset + + This document format is nearly identical to the field value of the + HTTP "Link" header field as defined in Section 3 of [RFC8288], more + specifically by its ABNF [RFC5234] production rule for "Link" and its + subsequent rules. It differs from the format for field values of the + HTTP "Link" header field only in that not only spaces and horizontal + tabs are allowed as separators but also newline characters as a means + to improve readability for humans. The use of non-ASCII characters + in the field value of the HTTP "Link" header field is not allowed and + as such is also not allowed in "application/linkset" link sets. + + The assigned media type for this format is "application/linkset". + + When converting an "application/linkset" document to a field value + for the HTTP "Link" header field, newline characters MUST be removed + or MUST be replaced by whitespace (SP) in order to comply with + Section 5.5 of [RFC9110]. + + Implementers of "application/linkset" link sets should strive to make + them self-contained by following the recommendations provided in + Section 4 regarding their use outside the context of an HTTP + interaction. + + It should be noted that the "application/linkset" format specified + here is different from the "application/link-format" format specified + in [RFC6690] in that the former fully matches the field value of the + HTTP "Link" header field as defined in Section 3 of [RFC8288], + whereas the latter introduces constraints on that definition to meet + requirements for Constrained RESTful Environments (CoRE). + +4.2. JSON Document Format: application/linkset+json + + This document format uses JSON [RFC8259] as the syntax to represent a + set of links. The set of links follows the abstract model defined by + Section 2 of [RFC8288]. + + The assigned media type for this format is "application/ + linkset+json". + + In the interests of interoperability, "application/linkset+json" link + sets MUST be encoded using UTF-8 as per Section 8.1 of [RFC8259]. + + Implementers of "application/linkset+json" link sets should strive to + make them self-contained by following the recommendations provided in + Section 4 regarding their use outside the context of an HTTP + interaction. + + The "application/linkset+json" serialization allows for OPTIONAL + support of a JSON-LD serialization. This can be achieved by adding + an appropriate context to the "application/linkset+json" + serialization using the approach described in Section 6.1 of + [W3C.REC-json-ld]. Communities of practice can decide which context + best meets their application needs. Appendix A shows an example of a + possible context that, when added to a JSON serialization, allows it + to be interpreted as Resource Description Framework (RDF) data + [W3C.REC-rdf11-concepts]. + +4.2.1. Set of Links + + In the JSON representation of a set of links: + + * A set of links is represented in JSON as an object that MUST + contain "linkset" as its sole member. + + * The value of the "linkset" member is an array in which a distinct + JSON object -- the "link context object" (see Section 4.2.2) -- is + used to represent links that have the same link context. + + * Even if there is only one link context object, it MUST be wrapped + in an array. + +4.2.2. Link Context Object + + In the JSON representation, one or more links that have the same link + context are represented by a JSON object -- the link context object. + A link context object adheres to the following rules: + + * Each link context object MAY contain an "anchor" member with a + value that represents the link context. If present, this value + MUST be a URI reference and SHOULD NOT be a relative reference as + defined in Section 4.1 of [RFC3986]. + + * For each distinct relation type that the link context has with + link targets, a link context object MUST contain an additional + member. The value of this member is an array in which a distinct + JSON object -- the "link target object" (see Section 4.2.3) -- + MUST be used for each link target for which the relationship with + the link context (value of the encompassing "anchor" member) + applies. The name of this member expresses the relation type of + the link as follows: + + - For registered relation types (Section 2.1.1 of [RFC8288]), the + name of this member is the registered name of the relation + type. + + - For extension relation types (Section 2.1.2 of [RFC8288]), the + name of this member is the URI that uniquely represents the + relation type. + + * Even if there is only one link target object, it MUST be wrapped + in an array. + +4.2.3. Link Target Object + + In the JSON representation, a link target is represented by a JSON + object -- the link target object. A link target object adheres to + the following rules: + + * Each link target object MUST contain an "href" member with a value + that represents the link target. This value MUST be a URI + reference and SHOULD NOT be a relative reference as defined in + Section 4.1 of [RFC3986]. Cases where the "href" member is + present but no value is provided for it (i.e., the resource + providing the set of links is the target of the link in the link + target object) MUST be handled by providing an "href" member with + an empty string as its value ("href": ""). + + * In many cases, a link target is further qualified by target + attributes. Various types of attributes exist, and they are + conveyed as additional members of the link target object as + detailed in Section 4.2.4. + + The following example of a JSON-serialized set of links represents + one link with its core components: link context, link relation type, + and link target. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "next": [ + {"href": "https://example.com/foo"} + ] + } + ] + } + + Figure 1: Simple linkset example + + The following example of a JSON-serialized set of links represents + two links that share a link context and relation type but have + different link targets. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "item": [ + {"href": "https://example.com/foo1"}, + {"href": "https://example.com/foo2"} + ] + } + ] + } + + Figure 2: Linkset with two links with the same context + + The following example shows a set of links that represents two links, + each with a different link context, link target, and relation type. + One relation type is registered, and the other is an extension + relation type. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "next": [ + {"href": "https://example.com/foo1"} + ] + }, + { "anchor": "https://example.net/boo", + "https://example.com/relations/baz" : [ + {"href": "https://example.com/foo2"} + ] + } + ] + } + + Figure 3: Linkset with two links with different contexts + +4.2.4. Link Target Attributes + + A link may be further qualified by target attributes as defined by + Section 2 of [RFC8288]. Three types of attributes exist: + + * Serialization-defined attributes as described in Section 3.4.1 of + [RFC8288]. + + * Extension attributes defined and used by communities as allowed by + Section 3.4.2 of [RFC8288]. + + * Internationalized versions of the "title" attribute as defined by + [RFC8288] and of extension attributes allowed by Section 3.4 of + [RFC8288]. + + The handling of these different types of attributes is described in + the sections below. + +4.2.4.1. Target Attributes Defined by Web Linking + + Section 3.4.1 of [RFC8288] defines the following target attributes + that may be used to annotate links: "hreflang", "media", "title", + "title*", and "type"; these target attributes follow different + occurrence and value patterns. In the JSON representation, these + attributes MUST be conveyed as additional members of the link target + object as follows: + + "hreflang": The "hreflang" target attribute, defined as optional and + repeatable by [RFC8288], MUST be represented by an "hreflang" + member, its value MUST be an array (even if there is only one + value to be represented), and each value in that array MUST be a + string -- representing one value of the "hreflang" target + attribute for a link -- that follows the same model as the syntax + discussed in [RFC8288]. + + "media": The "media" target attribute, defined as optional and not + repeatable by [RFC8288], MUST be represented by a "media" member + in the link target object, and its value MUST be a string that + follows the same model as the syntax discussed in [RFC8288]. + + "title": The "title" target attribute, defined as optional and not + repeatable by [RFC8288], MUST be represented by a "title" member + in the link target object, and its value MUST be a JSON string. + + "title*": The "title*" target attribute, defined as optional and not + repeatable by [RFC8288], is motivated by character encoding and + language issues and follows the model defined in [RFC8187]. The + details of the JSON representation that applies to "title*" are + described in Section 4.2.4.2. + + "type": The "type" target attribute, defined as optional and not + repeatable by [RFC8288], MUST be represented by a "type" member in + the link target object, and its value MUST be a string that + follows the same model as the syntax discussed in [RFC8288]. + + The following example illustrates how the "hreflang" (repeatable) + target attribute and the "type" (not repeatable) target attribute are + represented in a link target object. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "next": [ + { "href": "https://example.com/foo", + "type": "text/html", + "hreflang": [ "en" , "de" ] + } + ] + } + ] + } + + Figure 4: Linkset with "hreflang" and "type" target attributes + +4.2.4.2. Internationalized Target Attributes + + In addition to the target attributes described in Section 4.2.4.1, + Section 3.4 of [RFC8288] also supports attributes that follow the + content model of [RFC8187]. In [RFC8288], these target attributes + are recognizable by the use of a trailing asterisk in the attribute + name, such as "title*". The content model of [RFC8187] uses a + string-based microsyntax that represents the character encoding, an + optional language tag, and the escaped attribute value encoded + according to the specified character encoding. + + The JSON serialization for these target attributes MUST be as + follows: + + * An internationalized target attribute is represented as a member + of the link context object with the same name (including the "*") + as the attribute. + + * The character encoding information as prescribed by [RFC8187] is + not preserved; instead, the content of the internationalized + attribute is represented as a JSON string. + + * The value of the internationalized target attribute is an array + that contains one or more JSON objects. The name of one member of + such JSON objects is "value", and its value is the actual content + (in its unescaped version) of the internationalized target + attribute, i.e., the value of the attribute from which the + encoding and language information are removed. The name of + another, optional member of such JSON objects is "language", and + its value is the language tag [RFC5646] for the language in which + the attribute content is conveyed. + + The following example illustrates how the "title*" target attribute + as defined by Section 3.4.1 of [RFC8288] is represented in a link + target object. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "next": [ + { "href": "https://example.com/foo", + "type": "text/html", + "hreflang": [ "en" , "de" ], + "title": "Next chapter", + "title*": [ { "value": "nächstes Kapitel" , + "language" : "de" } ] + } + ] + } + ] + } + + Figure 5: Linkset with "title" and "title*" target attributes + + The above example assumes that the German title contains an umlaut + character (in the original syntax, it would be encoded as title*=UTF- + 8'de'n%c3%a4chstes%20Kapitel), which gets encoded in its unescaped + form in the JSON representation. Implementations MUST properly + decode/encode internationalized target attributes that follow the + model of [RFC8187] when transcoding between the "application/linkset" + format and the "application/linkset+json" format. + +4.2.4.3. Extension Target Attributes + + Extension target attributes (e.g., as listed in Section 4.2.4.1) are + attributes that are not defined by Section 3.4.1 of [RFC8288] but are + nevertheless used to qualify links. They can be defined by + communities in any way deemed necessary, and it is up to them to make + sure their usage is understood by target applications. However, + lacking standardization, there is no interoperable understanding of + these extension attributes. One important consequence is that their + cardinality is unknown to generic applications. Therefore, in the + JSON serialization, all extension target attributes are treated as + repeatable. + + The JSON serialization for these target attributes MUST be as + follows: + + * An extension target attribute is represented as a member of the + link target object with the same name as the attribute, including + the "*" if applicable. + + * The value of an extension attribute MUST be represented by an + array, even if there is only one value to be represented. + + * If the extension target attribute does not have a name with a + trailing asterisk, then each value in that array MUST be a JSON + string that represents one value of the attribute. + + * If the extension attribute has a name with a trailing asterisk (it + follows the content model of [RFC8187]), then each value in that + array MUST be a JSON object. The value of each such JSON object + MUST be structured as described in Section 4.2.4.2. + + The following example shows a link target object with three extension + target attributes. The value for each extension target attribute is + an array. The first two are regular extension target attributes, + with the first one ("foo") having only one value and the second one + ("bar") having two. The last extension target attribute ("baz*") + follows the naming rule of [RFC8187] and therefore is encoded + according to the serialization described in Section 4.2.4.2. + + { "linkset": + [ + { "anchor": "https://example.net/bar", + "next": [ + { "href": "https://example.com/foo", + "type": "text/html", + "foo": [ "foovalue" ], + "bar": [ "barone", "bartwo" ], + "baz*": [ { "value": "bazvalue" , + "language" : "en" } ] + } + ] + } + ] + } + + Figure 6: Linkset with extension target attributes + +4.2.5. JSON Extensibility + + The Web Linking model [RFC8288] provides for the use of extension + target attributes as discussed in Section 4.2.4.3. The use of other + forms of extensions is NOT RECOMMENDED. Limiting the JSON format in + this way allows unambiguous round trips between links provided in the + HTTP "Link" header field, sets of links serialized according to the + "application/linkset" format, and sets of links serialized according + to the "application/linkset+json" format. + + Cases may exist in which the use of extensions other than those + discussed in Section 4.2.4.3 may be useful -- for example, when a + link set publisher needs to include descriptive or technical metadata + for internal consumption. If such extensions are used, they MUST NOT + change the semantics of the JSON members defined in this + specification. Agents that consume JSON linkset documents can safely + ignore such extensions. + +5. The "profile" Parameter for Media Types to Represent Sets of Links + + As a means to convey specific constraints or conventions (as per + [RFC6906]) that apply to a link set document, the "profile" parameter + MAY be used in conjunction with the media types "application/linkset" + and "application/linkset+json" as detailed in Sections 4.1 and 4.2, + respectively. For example, the parameter could be used to indicate + that a link set uses a specific, limited set of link relation types. + + The value of the "profile" parameter MUST be a non-empty list of + space-separated URIs, each of which identifies specific constraints + or conventions that apply to the link set document. When providing + multiple profile URIs, care should be taken that the corresponding + profiles are not conflicting. Profile URIs MAY be registered in the + IANA's "Profile URIs" registry in the manner specified by [RFC7284]. + + The presence of a "profile" parameter in conjunction with the + "application/linkset" and "application/linkset+json" media types does + not change the semantics of a link set. As such, clients with and + without knowledge of profile URIs can use the same representation. + + Section 7.4.2 shows an example of using the "profile" parameter in + conjunction with the "application/linkset+json" media type. + +6. The "linkset" Relation Type for Linking to a Set of Links + + The target of a link with the "linkset" relation type provides a set + of links, including links in which the resource that is the link + context participates. + + A link with the "linkset" relation type MAY be provided in the header + field and/or the body of a resource's representation. It may also be + discovered by other means, such as through client-side information. + + A resource MAY provide more than one link with a "linkset" relation + type. Multiple such links can refer to the same set of links + expressed using different media types, or to different sets of links, + potentially provided by different third-party services. + + The set of links provided by the resource that is the target of a + "linkset" link may contain links in which the resource that is the + context of the "linkset" link does not participate. User agents MUST + process each link in the link set independently, including processing + of the link context and link target, and MAY ignore links from the + link set in which the context of the "linkset" link does not + participate. + + A user agent that follows a "linkset" link and obtains links for + which anchors and targets are expressed as relative references (as + per Section 4.1 of [RFC3986]) MUST determine what the context is for + these links; it SHOULD ignore links for which it is unable to + unambiguously make that determination. + + As a means to convey specific constraints or conventions (as per + [RFC6906]) that apply to a link set document, the "profile" attribute + MAY be used in conjunction with the "linkset" link relation type. + For example, the attribute could be used to indicate that a link set + uses a specific, limited set of link relation types. The value of + the "profile" attribute MUST be a non-empty list of space-separated + URIs, each of which identifies specific constraints or conventions + that apply to the link set document. Profile URIs MAY be registered + in the IANA's "Profile URIs" registry in the manner specified by + [RFC7284]. Section 7.4.1 shows an example of using the "profile" + attribute on a link with the "linkset" relation type, making both the + link set and the profile(s) to which it complies discoverable. + +7. Examples + + Sections 7.1 and 7.2 show examples whereby a set of links is provided + as "application/linkset" and "application/linkset+json" documents, + respectively. Section 7.3 illustrates the use of the "linkset" link + relation type to support the discovery of sets of links, and + Section 7.4 shows how to convey profile information pertaining to a + link set. + +7.1. Set of Links Provided as "application/linkset" + + Figure 7 shows a client issuing an HTTP GET request against resource + <https://example.org/links/resource1>. + + GET /links/resource1 HTTP/1.1 + Host: example.org + + Figure 7: Client HTTP GET request + + Figure 8 shows the response to the GET request of Figure 7. The + response contains a "Content-Type" header field specifying that the + media type of the response is "application/linkset". A set of links, + revealing authorship and versioning related to resource + <https://example.org/resource1>, is provided in the response body. + The HTTP "Link" header field indicates the availability of an + alternate representation of the set of links using media type + "application/linkset+json". + + HTTP/1.1 200 OK + Date: Mon, 12 Aug 2019 10:35:51 GMT + Server: Apache-Coyote/1.1 + Content-Length: 1023 + Content-Type: application/linkset + Link: <https://example.org/links/resource1> + ; rel="alternate" + ; type="application/linkset+json" + + <https://authors.example.net/johndoe> + ; rel="author" + ; type="application/rdf+xml" + ; anchor="https://example.org/resource1", + <https://example.org/resource1?version=3> + ; rel="latest-version" + ; type="text/html" + ; anchor="https://example.org/resource1", + <https://example.org/resource1?version=2> + ; rel="predecessor-version" + ; type="text/html" + ; anchor="https://example.org/resource1?version=3", + <https://example.org/resource1?version=1> + ; rel="predecessor-version" + ; type="text/html" + ; anchor="https://example.org/resource1?version=2", + <https://example.org/resource1?version=1> + ; rel="memento" + ; type="text/html" + ; datetime="Thu, 13 Jun 2019 09:34:33 GMT" + ; anchor="https://example.org/resource1", + <https://example.org/resource1?version=2> + ; rel="memento" + ; type="text/html" + ; datetime="Sun, 21 Jul 2019 12:22:04 GMT" + ; anchor="https://example.org/resource1", + <https://authors.example.net/alice> + ; rel="author" + ; anchor="https://example.org/resource1#comment=1" + + Figure 8: Response to HTTP GET includes a set of links + +7.2. Set of Links Provided as "application/linkset+json" + + Figure 9 shows the client issuing an HTTP GET request against + <https://example.org/links/resource1>. In the request, the client + uses an "Accept" header field to indicate that it prefers a response + in the "application/linkset+json" format. + + GET links/resource1 HTTP/1.1 + Host: example.org + Accept: application/linkset+json + + Figure 9: Client HTTP GET request expressing preference for an + "application/linkset+json" response + + Figure 10 shows the response to the HTTP GET request of Figure 9. + The set of links is serialized according to the media type + "application/linkset+json". + + HTTP/1.1 200 OK + Date: Mon, 12 Aug 2019 10:46:22 GMT + Server: Apache-Coyote/1.1 + Content-Type: application/linkset+json + Link: <https://example.org/links/resource1> + ; rel="alternate" + ; type="application/linkset" + Content-Length: 1246 + + { "linkset": + [ + { "anchor": "https://example.org/resource1", + "author": [ + { "href": "https://authors.example.net/johndoe", + "type": "application/rdf+xml" + } + ], + "memento": [ + { "href": "https://example.org/resource1?version=1", + "type": "text/html", + "datetime": "Thu, 13 Jun 2019 09:34:33 GMT" + }, + { "href": "https://example.org/resource1?version=2", + "type": "text/html", + "datetime": "Sun, 21 Jul 2019 12:22:04 GMT" + } + ], + "latest-version": [ + { "href": "https://example.org/resource1?version=3", + "type": "text/html" + } + ] + }, + { "anchor": "https://example.org/resource1?version=3", + "predecessor-version": [ + { "href": "https://example.org/resource1?version=2", + "type": "text/html" + } + ] + }, + { "anchor": "https://example.org/resource1?version=2", + "predecessor-version": [ + { "href": "https://example.org/resource1?version=1", + "type": "text/html" + } + ] + }, + { "anchor": "https://example.org/resource1#comment=1", + "author": [ + { "href": "https://authors.example.net/alice"} + ] + } + ] + } + + Figure 10: Response to the client's request for the linkset + +7.3. Discovering a Link Set via the "linkset" Link Relation Type + + Figure 11 shows a client issuing an HTTP HEAD request against + resource <https://example.org/resource1>. + + HEAD resource1 HTTP/1.1 + Host: example.org + + Figure 11: Client HTTP HEAD request + + Figure 12 shows the response to the HEAD request of Figure 11. The + response contains an HTTP "Link" header field with a link that has + the "linkset" relation type. It indicates that a set of links is + provided by resource <https://example.org/links/resource1>, which + provides a representation with media type "application/linkset+json". + + HTTP/1.1 200 OK + Date: Mon, 12 Aug 2019 10:45:54 GMT + Server: Apache-Coyote/1.1 + Link: <https://example.org/links/resource1> + ; rel="linkset" + ; type="application/linkset+json" + Content-Length: 236 + Content-Type: text/html;charset=utf-8 + + Figure 12: Response to HTTP HEAD request + +7.4. Link Set Profiles + + The examples in this section illustrate the use of the "profile" + attribute for a link with the "linkset" link relation type and the + "profile" attribute for a link set media type. The examples are + inspired by the implementation of link sets by GS1 (the standards + body behind many of the world's barcodes). + +7.4.1. Using a "profile" Attribute with a "linkset" Link + + Figure 13 shows a client issuing an HTTP HEAD request against trade + item 09506000134352 at <https://id.gs1.org/01/9506000134352>. + + HEAD /01/9506000134352 HTTP/1.1 + Host: id.gs1.org + + Figure 13: Client HTTP HEAD request + + Figure 14 shows the server's response to the request of Figure 13, + including a "linkset" link with a "profile" attribute that has the + profile URI <https://www.gs1.org/voc/?show=linktypes> as its value. + Dereferencing that URI yields a profile document that lists all the + link relation types that a client can expect when requesting the link + set made discoverable by the "linkset" link. The link relation types + are presented in abbreviated form, e.g., <gs1:activityIdeas>, whereas + the actual link relation type URIs are available as hyperlinks on the + abbreviations, e.g., <https://www.gs1.org/voc/activityIdeas>. For + posterity, that profile document was saved in the Internet Archive at + <https://web.archive.org/web/20210927160406/https://www.gs1.org/ + voc/?show=linktypes> on 27 September 2021. + + HTTP/1.1 307 Temporary Redirect + Date: Mon, 27 Sep 2021 16:03:07 GMT + Server: nginx + Link: <https://id.gs1.org/01/9506000134352?linkType=all> + ; rel="linkset" + ; type="application/linkset+json" + ; profile="https://www.gs1.org/voc/?show=linktypes" + Location: https://example.com/risotto-rice-with-mushrooms/ + + Figure 14: Response to the client's HEAD request, including a + "profile" attribute for the "linkset" link + +7.4.2. Using a "profile" Parameter with a Link Set Media Type + + Figure 15 shows a client issuing an HTTP HEAD request against the + link set <https://id.gs1.org/01/9506000134352?linkType=all> that was + discovered through the HTTP interactions shown in Section 7.4.1. + + HEAD /01/9506000134352?linkType=all HTTP/1.1 + Host: id.gs1.org + + Figure 15: Client HTTP HEAD request + + Figure 16 shows the server's response to the request of Figure 15. + Note the "profile" parameter for the "application/linkset+json" media + type, which has as its value the same profile URI + <https://www.gs1.org/voc/?show=linktypes> as was used in Figure 14. + + HTTP/1.1 200 OK + Date: Mon, 27 Sep 2021 16:03:33 GMT + Server: nginx + Content-Type: application/linkset+json; + profile="https://www.gs1.org/voc/?show=linktypes" + Content-Length: 396 + + Figure 16: Response to the client's HEAD request, including a + "profile" parameter for the "application/linkset+json" media type + +7.4.3. Using a Link with a "profile" Link Relation Type + + Note that the response shown in Figure 16 from the link set resource + is equivalent to the response shown in Figure 17, which leverages the + "profile" link relation type defined in [RFC6906]. + + HTTP/1.1 200 OK + Date: Mon, 27 Sep 2021 16:03:33 GMT + Server: nginx + Content-Type: application/linkset+json + Link: <https://www.gs1.org/voc/?show=linktypes>; rel="profile" + Content-Length: 396 + + Figure 17: Response to the client's HEAD request, including a + "profile" link + + A link with a "profile" link relation type as shown in Figure 17 can + also be conveyed in the link set document itself. This is + illustrated by Figure 18. Following the recommendation that all + links in a link set document should have an explicit anchor, such a + link has the URI of the link set itself as the anchor and the profile + URI as the target. Multiple profile URIs are handled by using + multiple "href" members. + + { "linkset": + [ + { "anchor": "https://id.gs1.org/01/9506000134352?linkType=all", + "profile": [ + {"href": "https://www.gs1.org/voc/?show=linktypes"} + ] + }, + { "anchor": "https://id.gs1.org/01/9506000134352", + "https://gs1.org/voc/whatsInTheBox": [ + {"href": "https://example.com/en/packContents/GB"} + ] + } + ] + } + + Figure 18: A linkset that declares the profile it complies with, + using a "profile" link + +8. IANA Considerations + +8.1. Link Relation Type: linkset + + The link relation type below has been registered by IANA in the "Link + Relation Types" registry as per Section 4.2 of [RFC8288]: + + Relation Name: linkset + + Description: The link target of a link with the "linkset" relation + type provides a set of links, including links in which the link + context of the link participates. + + Reference: RFC 9264 + +8.2. Media Type: application/linkset + + The Internet media type "application/linkset" for a linkset encoded + as described in Section 4.1 has been registered by IANA in the "Media + Types" registry as per [RFC6838]. + + Type name: application + + Subtype name: linkset + + Required parameters: N/A + + Optional parameters: profile + + Encoding considerations: Linksets are encoded according to the + definitions provided in [RFC8288]. The encoding discussed in + [RFC8288] is based on the general encoding rules specified by HTTP + [RFC9110] and allows specific parameters to be extended by the + indication of character encoding and language as defined by + [RFC8187]. + + Security considerations: The security considerations of RFC 9264 + apply. + + Interoperability considerations: N/A + + Published specification: RFC 9264 + + Applications that use this media type: This media type is not + specific to any application, as it can be used by any application + that wants to interchange Web Links. + + Additional information: + Magic number(s): N/A + File extension(s): This media type does not propose a specific + extension. + Macintosh file type code(s): TEXT + + Person & email address to contact for further information: Erik + Wilde <erik.wilde@dret.net> + + Intended usage: COMMON + + Restrictions on usage: none + + Author: Erik Wilde <erik.wilde@dret.net> + + Change controller: IETF + +8.3. Media Type: application/linkset+json + + The Internet media type "application/linkset+json" for a linkset + encoded as described in Section 4.2 has been registered by IANA in + the "Media Types" registry as per [RFC6838]. + + Type name: application + + Subtype name: linkset+json + + Required parameters: N/A + + Optional parameters: profile + + Encoding considerations: The encoding considerations of [RFC8259] + apply. + + Security considerations: The security considerations of RFC 9264 + apply. + + Interoperability considerations: The interoperability considerations + of [RFC8259] apply. + + Published specification: RFC 9264 + + Applications that use this media type: This media type is not + specific to any application, as it can be used by any application + that wants to interchange Web Links. + + Additional information: + Magic number(s): N/A + File extension(s): JSON documents often use ".json" as the file + extension, and this media type does not propose a specific + extension other than this generic one. + Macintosh file type code(s): TEXT + + Person & email address to contact for further information: Erik + Wilde <erik.wilde@dret.net> + + Intended usage: COMMON + + Restrictions on usage: none + + Author: Erik Wilde <erik.wilde@dret.net> + + Change controller: IETF + +9. Security Considerations + + The security considerations of Section 7 of [RFC3986] apply, as well + as those of Web Linking [RFC8288] as long as the latter are not + specifically discussing the risks of exposing information in HTTP + header fields. + + In general, links may cause information leakage when they expose + information (such as URIs) that can be sensitive or private. Links + may expose "hidden URIs" that are not supposed to be openly shared + and that may not be sufficiently protected. Ideally, none of the + URIs exposed in links should be supposed to be "hidden"; instead, if + these URIs are supposed to be limited to certain users, then + technical measures should be put in place so that accidentally + exposing them does not cause any harm. + + For the specific mechanisms defined in this specification, two + security considerations should be taken into account: + + * The Web Linking model always has an "implicit context", which is + the resource of the HTTP interaction. This original context can + be lost or can change when self-contained link representations are + moved. Changing the context can change the interpretation of + links when they have no explicit anchor or when they use relative + URIs. Applications may choose to ignore links that have no + explicit anchor or that use relative URIs when these are exchanged + in standalone resources. + + * The model introduced in this specification supports "third-party + links", where one party can provide links that have another + party's resource as an anchor. Depending on the link semantics + and the application context, it is important to verify that there + is sufficient trust in that third party to allow it to provide + these links. Applications may choose to treat third-party links + differently than cases where a resource and the links for that + resource are provided by the same party. + +10. References + +10.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, + RFC 3986, DOI 10.17487/RFC3986, January 2005, + <https://www.rfc-editor.org/info/rfc3986>. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + <https://www.rfc-editor.org/info/rfc5234>. + + [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying + Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646, + September 2009, <https://www.rfc-editor.org/info/rfc5646>. + + [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type + Specifications and Registration Procedures", BCP 13, + RFC 6838, DOI 10.17487/RFC6838, January 2013, + <https://www.rfc-editor.org/info/rfc6838>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8187] Reschke, J., "Indicating Character Encoding and Language + for HTTP Header Field Parameters", RFC 8187, + DOI 10.17487/RFC8187, September 2017, + <https://www.rfc-editor.org/info/rfc8187>. + + [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data + Interchange Format", STD 90, RFC 8259, + DOI 10.17487/RFC8259, December 2017, + <https://www.rfc-editor.org/info/rfc8259>. + + [RFC8288] Nottingham, M., "Web Linking", RFC 8288, + DOI 10.17487/RFC8288, October 2017, + <https://www.rfc-editor.org/info/rfc8288>. + + [RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, + Ed., "HTTP Semantics", STD 97, RFC 9110, + DOI 10.17487/RFC9110, June 2022, + <https://www.rfc-editor.org/info/rfc9110>. + + [W3C.REC-json-ld] + Sporny, M., Ed., Kellogg, G., Ed., and M. Lanthaler, Ed., + "JSON-LD 1.1: A JSON-based Serialization for Linked Data", + W3C Recommendation REC-json-ld-20140116, July 2020, + <https://www.w3.org/TR/json-ld/>. + +10.2. Informative References + + [DCMI-TERMS] + Dublin Core Metadata Initiative, "DCMI Metadata Terms", + January 2020, <https://www.dublincore.org/specifications/ + dublin-core/dcmi-terms/>. + + [RFC5988] Nottingham, M., "Web Linking", RFC 5988, + DOI 10.17487/RFC5988, October 2010, + <https://www.rfc-editor.org/info/rfc5988>. + + [RFC6690] Shelby, Z., "Constrained RESTful Environments (CoRE) Link + Format", RFC 6690, DOI 10.17487/RFC6690, August 2012, + <https://www.rfc-editor.org/info/rfc6690>. + + [RFC6906] Wilde, E., "The 'profile' Link Relation Type", RFC 6906, + DOI 10.17487/RFC6906, March 2013, + <https://www.rfc-editor.org/info/rfc6906>. + + [RFC7284] Lanthaler, M., "The Profile URI Registry", RFC 7284, + DOI 10.17487/RFC7284, June 2014, + <https://www.rfc-editor.org/info/rfc7284>. + + [W3C.REC-rdf11-concepts] + Cyganiak, R., Ed., Wood, D., Ed., and M. Lanthaler, Ed., + "RDF 1.1 Concepts and Abstract Syntax", W3C Consortium + Recommendation REC-rdf11-concepts, February 2014, + <https://www.w3.org/TR/rdf11-concepts/>. + +Appendix A. JSON-LD Context + + A set of links rendered according to the JSON serialization defined + in Section 4.2 can be interpreted as RDF triples by adding a JSON-LD + context [W3C.REC-json-ld] that maps the JSON keys to corresponding + Linked Data terms. And, as per Section 6.1 of [W3C.REC-json-ld], + when delivering a link set that is rendered according to the + "application/linkset+json" media type to a user agent, a server can + convey the availability of such a JSON-LD context by using a link + with the relation type "http://www.w3.org/ns/json-ld#context" in the + HTTP "Link" header field. + + Figure 19 shows the response to an HTTP GET against the URI of a link + set resource and illustrates this approach to support the discovery + of a JSON-LD context. This example is inspired by the GS1 + implementation and shows a link set that uses relation types from the + GS1 vocabulary at <https://www.gs1.org/voc/> that are expressed as + HTTP URIs. + + HTTP/1.1 200 OK + Date: Mon, 11 Oct 2021 10:48:22 GMT + Server: Apache-Coyote/1.1 + Content-Type: application/linkset+json + Link: <https://example.org/contexts/linkset.jsonld> + ; rel="http://www.w3.org/ns/json-ld#context" + ; type="application/ld+json" + Content-Length: 1532 + + { + "linkset": [ + { + "anchor": "https://id.gs1.org/01/09506000149301", + "https://gs1.org/voc/pip": [ + { + "href": "https://example.com/en/defaultPage", + "hreflang": [ + "en" + ], + "type": "text/html", + "title": "Product information" + }, + { + "href": "https://example.com/fr/defaultPage", + "hreflang": [ + "fr" + ], + "title": "Information produit" + } + ], + "https://gs1.org/voc/whatsInTheBox": [ + { + "href": "https://example.com/en/packContents/GB", + "hreflang": [ + "en" + ], + "title": "What's in the box?" + }, + { + "href": "https://example.com/fr/packContents/FR", + "hreflang": [ + "fr" + ], + "title": "Qu'y a-t-il dans la boite?" + }, + { + "href": "https://example.com/fr/packContents/CH", + "hreflang": [ + "fr" + ], + "title": "Qu'y a-t-il dans la boite?" + } + ], + "https://gs1.org/voc/relatedVideo": [ + { + "href": "https://video.example", + "hreflang": [ + "en", + "fr" + ], + "title*": [ + { + "value": "See it in action!", + "language": "en" + }, + { + "value": "Voyez-le en action!", + "language": "fr" + } + ] + } + ] + } + ] + } + + Figure 19: Using a typed link to support the discovery of a JSON- + LD context for a linkset + + In order to obtain the JSON-LD context conveyed by the server, the + user agent issues an HTTP GET against the link target of the link + with the "http://www.w3.org/ns/json-ld#context" relation type. The + response to this GET is shown in Figure 20. This particular JSON-LD + context maps "application/linkset+json" representations of link sets + to Dublin Core terms [DCMI-TERMS]. Note that the "linkset" entry in + the JSON-LD context is introduced to support links with the "linkset" + relation type in link sets. + + HTTP/1.1 200 OK + Content-Type: application/ld+json + Content-Length: 658 + + { + "@context": [ + { + "@version": 1.1, + "@vocab": "https://gs1.org/voc/", + "anchor": "@id", + "href": "@id", + "linkset": { + "@id": "@graph", + "@context": { + "linkset": "linkset" + } + }, + "title": { + "@id": "http://purl.org/dc/terms/title" + }, + "title*": { + "@id": "http://purl.org/dc/terms/title" + }, + "type": { + "@id": "http://purl.org/dc/terms/format" + } + }, + { + "language": "@language", + "value": "@value", + "hreflang": { + "@id": "http://purl.org/dc/terms/language", + "@container": "@set" + } + } + ] + } + + Figure 20: JSON-LD context mapping to Dublin Core terms + + Applying the JSON-LD context of Figure 20 to the link set of + Figure 19 allows transforming the "application/linkset+json" link set + to an RDF link set. Figure 21 shows the latter represented by means + of the "text/turtle" RDF serialization. + + <https://example.com/en/defaultPage> + <http://purl.org/dc/terms/format> + "text/html" . + <https://example.com/en/defaultPage> + <http://purl.org/dc/terms/language> + "en" . + <https://example.com/en/defaultPage> + <http://purl.org/dc/terms/title> + "Product information" . + <https://example.com/en/packContents/GB> + <http://purl.org/dc/terms/language> + "en" . + <https://example.com/en/packContents/GB> + <http://purl.org/dc/terms/title> + "What's in the box?" . + <https://example.com/fr/defaultPage> + <http://purl.org/dc/terms/language> + "fr" . + <https://example.com/fr/defaultPage> + <http://purl.org/dc/terms/title> + "Information produit" . + <https://example.com/fr/packContents/CH> + <http://purl.org/dc/terms/language> + "fr" . + <https://example.com/fr/packContents/CH> + <http://purl.org/dc/terms/title> + "Qu'y a-t-il dans la boite?" . + <https://example.com/fr/packContents/FR> + <http://purl.org/dc/terms/language> + "fr" . + <https://example.com/fr/packContents/FR> + <http://purl.org/dc/terms/title> + "Qu'y a-t-il dans la boite?" . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/pip> + <https://example.com/en/defaultPage> . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/pip> + <https://example.com/fr/defaultPage> . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/relatedVideo> + <https://video.example> . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/whatsInTheBox> + <https://example.com/en/packContents/GB> . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/whatsInTheBox> + <https://example.com/fr/packContents/CH> . + <https://id.gs1.org/01/09506000149301> + <https://gs1.org/voc/whatsInTheBox> + <https://example.com/fr/packContents/FR> . + <https://video.example> + <http://purl.org/dc/terms/language> + "en" . + <https://video.example> + <http://purl.org/dc/terms/language> + "fr" . + <https://video.example> + <http://purl.org/dc/terms/title> + "See it in action!"@en . + <https://video.example> + <http://purl.org/dc/terms/title> + "Voyez-le en action!"@fr . + + Figure 21: RDF serialization of the linkset resulting from + applying the JSON-LD context + +Acknowledgements + + Thanks for comments and suggestions provided by Phil Archer, + Dominique Guinard, Mark Nottingham, Julian Reschke, Rob Sanderson, + Stian Soiland-Reyes, Sarven Capadisli, and Addison Phillips. + +Authors' Addresses + + Erik Wilde + Axway + Email: erik.wilde@dret.net + + + Herbert Van de Sompel + Data Archiving and Networked Services + Email: herbert.van.de.sompel@dans.knaw.nl + URI: https://orcid.org/0000-0002-0715-6126 |