diff --git a/jsonschema-hyperschema.xml b/jsonschema-hyperschema.xml index dbfb826f..e63b2ada 100644 --- a/jsonschema-hyperschema.xml +++ b/jsonschema-hyperschema.xml @@ -10,7 +10,7 @@ - + ]> @@ -388,35 +388,93 @@ The URI of the normative link description schema is: http://json-schema.org/draft-04/links (draft-04 version). -
+
- "Form"-like functionality can be defined by use of the "method" and "schema" keywords, which supplies a schema describing the data to supply to the server. - Functionality equivalent to dynamic URI generation is available through the "href" template and "hrefSchema". - - - The simplest kind of link has an "href" with no template variables, and no "schema". This does not - allow for any variance in the link URI, nor does it allow for a request document. + + Note that while the current draft does not provide a way to explicity + indicate HTTP method support, some way of providing a non-authoritative + hint may be added in a future draft (see issue #73 in the GitHub repository). + - An "href" with at least one template variable, but no "hrefSchema" or "schema", allows resolving - the template variable from the instance, but does not allow resolving it - from external data, nor does it allow a request document. + Link Description Objects do not directly indicate what operations, such + as HTTP methods for links with "http(s)://" URI schemes, are supported by + the target resource. Instead, operations should be inferred primarily from + link relation types and URI schemes. Additionally, + the presence of keywords related to data use often implies support for certain + operations. Note, however, that a resource may always decline an operation at + runtime, for instance due to application state that controls the operation's + availability. - An "href" with at least one template variable and with an "hrefSchema" allows using external - data to resolve the template, and falls back to resolving any remaining variables from the instance. + There are several ways that a client can use data can with a link: + + URI Template variables resolved from server-supplied instance data + URI Template variables resolved from client input + Replacing or modifying the target resource's representation + Submitting data for processing, where the data has no + inherent relation to the target resource's representation + - A link with a "schema" allows submitting external data either as a request body (if "method" is "post"), - or as a URI query string (if "method" is "get"). Such a query string replaces any query string - present after the "href" template is resolved. + In the human-oriented web, these cases are implemented through + a combination of HTML and JavaScript. The relatively rapid evolution + and broad adoption of JavaScript reduced the need to include all + features in HTML itself. - See the individual keyword descriptions below for details related to each of these cases. + Since JSON Hyper-Schema addresses all of these cases, and is consumed + primarily by client code rather than human users, its mechanisms do not + exactly match those of HTML. Instead, three schema keywords describe + the different kinds of input. Unless otherwise specified, schema keywords + are ignored when performing operations to which they are not semantically + relevant. +
+ + URI Template variables in "href" resolve from + server-supplied instance data by default. + "hrefSchema" allows a link to specify + a schema for resolving template variables from client-supplied data. + Regular JSON Schema validation features can be used to require resolution + for client data, forbid it, or allow client data while falling back to + server-supplied instance data if no client data is provided. + + + This offers a superset of traditional HTML GET forms, and a subset of all + possible URI construction that can be performed by JavaScript. To simulate + an HTML GET form, a link can require client input to all query string variables, + and forbid client input for all other template variables. + +
+
+ + HTML does not directly support target resource representation manipulation + through forms. Instead, JavaScript accomplishes this by intercepting the + form submission and using the appropriate HTTP request with the form data. + In JSON Hyper-Schema, "targetSchema" + supplies a non-authoritative description of the target resource's representation. + A client can use "targetSchema" to structure input, or (if it is absent or + if the client prefers to only use authoritative information), interact with + the target resource to confirm or discover its representation structure. + +
+
+ + The "submissionSchema" and + "submissionEncType" keywords + describe the domain of the processing function implemented by the target resource. + This directly corresponds to HTML "method"="post" forms. + The "form" + keyword can be used to enforce strict semantic compatibility with HTML "post" + forms, limiting operations to those that make use of the submission data. + Otherwise, as noted above, the submission schema and encoding are ignored + for operations to which they are not relevant. + +
- +
@@ -512,6 +570,10 @@ months for date-time input but using the standard date-time format for storage. + + Omitting this keyword has the same behavior as a schema of false, + which forbids all external data input. +
For example, this defines a schema for each of the query string @@ -579,13 +641,13 @@
- The above example simulates the behavior found in earlier drafts using only "hrefSchema", - which would allow the concurrent use of "schema" on a "post" link. + The above example simulates the HTML GET form behavior found in earlier drafts + using only "hrefSchema", which is necessary now that "method" has been removed.
-
+
The value of the "rel" property indicates the name of the relation to the target resource. The value MUST be a registered link relation from the IANA Link Relation Type Registry established in RFC 5988, or a normalized URI following the URI production of RFC 3986. @@ -702,7 +764,7 @@ GET /foo/
-
+
This property provides a schema that is expected to describe the link target's representation. Depending on the protocol, @@ -863,69 +925,54 @@ GET /foo/
-
+
- The following properties also apply to Link Description Objects, and provide functionality analogous to HTML forms, by providing a means for making a request with client- or user-selected information. + The following properties also apply to Link Description Objects, + and provide the ability to describe data for submission to the + target resource for processing, independent of manipulating the + target resource's representation. -
+
+ + The value of this keyword is a boolean. + - This property specifies that the client can construct a templated query or non-idempotent request to a resource. + Setting this keyword to true indicates that this link has + semantics analogous to + HTML "method"="post" forms. + This imposes additional constraints that are not present if + the value of this keyword is false. - If "method" is "get", the link identifies how a user can compute the URI of an arbitrary resource. For example, how to compute a link to a page of search results relating to the instance, for a user-selected query term. Despite being named after GET, there is no constraint on the method or protocol used to interact with the remote resource. + In particular, if "form" is true, request payloads SHOULD conform + to "submissionSchema" + and "submissionEncType", + and the link MUST NOT be used with operations that are incompatible + with those semantics. - If "method" is "post", the link specifies how a user can construct a document to submit to the link target for evaluation. + Note that "hrefSchema" already offers a superset + of the functionality of HTML GET forms, so there is no explicit + analogue for that aspect of HTML. - Values for this property SHOULD be lowercase, and SHOULD be compared case-insensitive. Use of other values not defined here SHOULD be ignored. + Omitting this keyword has the same behavior as a value of false.
-
+
- If present, this property indicates the media type format the client should use to encode a query parameter or send to the server. - If the method is "get", this will indicate how to encode the query-string that is appended to the "href" link target. - If the method is "post", this indicates which media type to send to the server and how to encode it. - -
- For example, with the following schema: - - - - This indicates that the client can query the server for instances that have a specific name. -
- -
- For example: - - - -
+ If present, this property indicates which media type to use + when sending data matching the + "submissionSchema" + to the target resource for processing, and how to encode it.
- If the method is "post", "application/json" is the default media type. + Omitting this keyword has the same behavior as a value of + "application/json". - As noted under method, these fields - are not restricted to HTTP URIs. -
For example, this link indicates that if you want to @@ -936,8 +983,7 @@ GET /foo/
-
+
- This property contains a schema which defines the acceptable structure of the document being encoded according to the "encType" property. + This property contains a schema which defines the + acceptable structure of the document being submitted + for processing by + according to the "submissionEncType" property. - Note that this does not define the structure for URI template variables. That is handed by "hrefSchema". If the method is "get" and the resolved URI Template has a query string, the query string produced by input validated against "schema" replaces the existing query string. + Note that this does not define the structure for URI template variables. That is handed by "hrefSchema". If the method is "get" and the resolved URI Template has a query string, the query string produced by input validated against "submissionSchema" replaces the existing query string. + + + This can be viewed as describing the domain of the processing + function implemented by the target resource. - This is a separate concept from the "targetSchema" property, which is describing the target information resource (including for replacing the contents of the resource in a PUT request), unlike "schema" which describes the user-submitted request data to be evaluated by the resource. + This is a separate concept from the "targetSchema" property, which is describing the target information resource (including for replacing the contents of the resource in a PUT request), unlike "submissionSchema" which describes the user-submitted request data to be evaluated by the resource. + "submissionSchema" is intended for use with requests that have payloads that are not + defined in terms of the target representation.
@@ -1056,6 +1111,10 @@ GET /foo/ Removed URI Template pre-processing Clarified how links and data submission work Clarified how validation keywords apply hyper-schema keywords and links + Clarified HTTP use with "targetSchema" + Renamed "schema" to "submissionSchema" + Renamed "encType" to "submissionEncType" + Removed "method", add "form" for HTML "post" form semantics