This is an old revision of the document!
<html> <body> <section>
<header> <h1>Collection.next+JSON - Document Format</h1> <h2>Lightweight hypermedia type for read/write Hypermedia/RESTful/HTTP APIs</h2> <h3>Description</h3> <p> Collection.next+JSON is a JSON-based read/write hypermedia-type designed to support management and querying of nested data collections. Collection.next+JSON is an extension of <a href="http://amundsen.com/media-types/collection/format/#data-types" title="Collection+JSON - Document Format">Collection+JSON</a> hypermedia format. </p> <dl> <dt>Author:</dt> <dd>Ioseb Dzmanashvili (<a href="mailto:ioseb.dzmanashvili@gmail.com">ioseb.dzmanashvili@gmail.com</a>)</dd> <dt>Dates:</dt> <dd>2012-03-26 (Created)</dd> <dt>Status:</dt> <dd class="stable"> application/vnd.collection.next+json (<a class="approved" href="http://www.iana.org/assignments/media-types/application/vnd.collection.next+json">Approved</a>) </dd> </dl> <h3>Contents</h3> <nav> <ol> <li><a href="#general">General Concepts and Goals</a></li> <li><a href="#objects">Objects</a></li> <li><a href="#arrays">Arrays</a></li> <li><a href="#properties">Properties</a></li> <li><a href="#relations">Link Relations</a></li> <li><a href="#translating-to-x-www-form-urlencoded">Translating to application/x-www-form-urlencoded</a></li> <li><a href="#acknowledgements">Acknowledgements</a></li> <li><a href="#references">References</a></li> <li><a href="#history">Update History</a></li> </ol> </nav> <blockquote><b>NOTE:</b><br>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <a href="http://tools.ietf.org/html/rfc2119" title="Key words for use in RFCs to Indicate Requirement Levels">RFC2119</a>. </blockquote> <blockquote><b>NOTE:</b><br>The data type names "OBJECT", "ARRAY", "NUMBER", "STRING", and "VALUE" in this document are to be interpreted as described in <a href="http://amundsen.com/media-types/collection/format/#data-types" title="Collection+JSON - Document Format">Collection+JSON</a> specification. </blockquote> </header> <section id="general"> <h2>1. General Concepts and Goals</h2> <p> Section defines general concepts describing all extensions to <a href="http://amundsen.com/media-types/collection/format/#data-types" title="Collection+JSON - Document Format">Collection+JSON</a> specification. </p> <p> Main goal of this extension is to improve existing capabilities of <a href="http://amundsen.com/media-types/collection/format/#data-types" title="Collection+JSON - Document Format">Collection+JSON</a> further and add more power and expressiveness to existing features of specification. </p> <p> Extension introduces several new <a href="#objects" class="keyword">objects</a>, <a href="#arrays" class="keyword">arrays</a> and <a href="#properties" class="keyword">properties</a> and adds more flexibility and semantics to various areas of base specification. </p> <p> When Collection.next+JSON document format is used for implementing APIs <code>application/vnd.collection.next+json</code> MUST be used as a value of the <a href="http://www.w3.org/Protocols/HTTP/1.1/rfc2616bis/draft-lafon-rfc2616bis-03.html#header.accept">Accept</a> and <a href="http://www.w3.org/Protocols/HTTP/1.1/rfc2616bis/draft-lafon-rfc2616bis-03.html#header.content-type">Content-Type</a> headers as shown in the examples below: </p> <pre><span class="comment">// sample POST request</span>
*** REQUEST *** POST /my-collection/ HTTP/1.1 Host: www.example.org <b>Content-Type: application/vnd.collection.next+json</b> Content-Length: ... { "template": {OBJECT} }
</pre>
<p>OR</p>
<pre><span class="comment">// sample GET request</span>
*** REQUEST *** GET /my-collection/ HTTP/1.1 Host: www.example.org <b>Accept: application/vnd.collection.next+json</b>
</pre>
</section> <section id="objects"> <h2>2. Objects</h2> <p> An object is an unordered collection of zero or more name/value pairs, where a name is a string and a value is a <code>string</code>, <code>number</code>, <code>boolean</code>, <code>null</code>, <code>object</code>, or <code>array</code>. </p> <p> Extension defines new set of objects. They are: the <a href="#object-list" class="keyword">list</a>, <a href="#object-status" class="keyword">status</a>, <a href="#object-method" class="keyword">method</a> and <a href="#object-enctype" class="keyword">enctype</a>. </p>
<section id="object-list"> <h3>2.1. list</h3> <p> The <a href="#object-list" class="keyword">list</a> object is a child property of the <a href="http://amundsen.com/media-types/collection/format/#arrays-data">data</a> array elements. </p> <p> The <a href="#object-list" class="keyword">list</a> object MAY contain any of three possible properties: <a href="#array-options" class="keyword">options</a> (REQUIRED), <a href="#property-multiple" class="keyword">multiple</a> (OPTIONAL) and <a href="#property-default" class="keyword">default</a> (OPTIONAL). </p> <p> If the <a href="#object-list" class="keyword">list</a> object is specified and it doesn't contain the <a href="#property-multiple" class="keyword">multiple</a> property clients SHOULD only use one of the values provided by the <a href="#array-options" class="keyword">options</a> array. </p> <p> If the <a href="#object-list" class="keyword">list</a> object is specified and it contains the <a href="#property-multiple" class="keyword">multiple</a> property which value is specified to <code>true</code>, clients MAY use any possible combination of multiple values provided by the <a href="#array-options" class="keyword">options</a> array. </p> <section id="query-templates"> <h4>2.1.1 Using the list object with query templates</h4> <p> Section describes possible behavior of using the <a href="#object-list" class="keyword">list</a> object within <a href="http://amundsen.com/media-types/collection/format/#query-templates">query templates</a>. </p> <pre><span class="comment">// sample query template with list object</span>
{ "queries": [ { "href": "http://service.com/my-resource", "rel": "search", "prompt": "Enter search string", <b>"data" : [ { "name": "gender", "prompt": "gender", "list": { "options": [ {"value": "female", "prompt": "Female"}, {"value": "male", "prompt": "Male"} ] } } ]</b> } ] }
</pre>
<p> There are two possible outcomes based on the example above and resulting queries are as follows: </p> <ul> <li> <p><code>http://service.com/my-resource?gender=female</code></p> </li> <li> <p><code>http://service.com/my-resource?gender=male</code></p> </li> </ul> <p> If the <a href="#property-multiple" class="keyword">multiple</a> property present and it's value is specified to <code>true</code> as shown in the following example: </p> <pre><span class="comment">// sample query template with list object and multiple property</span>
{ "queries": [ { "href": "http://service.com/my-resource", "rel": "search", "prompt": "Enter search string", "data" : [ { "name": "gender", "prompt": "gender", "list": { <b>"multiple": true</b>, "options": [ {"value": "female", "prompt": "Female"}, {"value": "male", "prompt": "Male"} ] } } ] } ] }
</pre>
<p> Possible outcomes of resulting queries would be as follows: </p> <ul> <li> <p><code>http://service.com/my-resource?gender=male&gender=female</code></p> </li> <li> <p><code>http://service.com/my-resource?gender=female</code></p> </li> <li> <p><code>http://service.com/my-resource?gender=male</code></p> </li> </ul> </section> <!-- /query templates --> <section id="object-template"> <h4>2.1.1 Using the list object in the template object</h4> <p> Section describes possible behavior of using the <a href="#object-list" class="keyword">list</a> object when used with the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <p> If the <a href="#property-multiple" class="keyword">multiple</a> property present and it's value is specified to <code>true</code> as shown in following example: </p> <pre><span class="comment">// sample template object with list object and type property</span>
{"collection": { "version": 1.0, <b>"template": {</b> "data" : [ { "name": "interests", "prompt": "Interests", "list": { <b>"multiple": true</b>, "options": [ {"value": "sports", "prompt": "Sports"}, {"value": "music", "prompt": "Music"} ] } } ] <b>}</b> }}
</pre>
<p> Clients MAY submit several combinations of <code>interests</code> input: </p> <pre><span class="comment">// sample template object with list object and type property</span>
*** REQUEST *** POST /my-collection/ HTTP/1.1 Host: www.example.org Content-Type: application/vnd.collection.next+json { "template": { <b>"data" : [ {"name": "interests", "value": "sports"}, {"name": "interests", "value": "music"} ]</b> } }
</pre>
<p> OR </p> <pre><span class="comment">// sample template object with list object and type property</span>
*** REQUEST *** POST ... { "template": { <b>"data" : [ {"name": "interests", "value": "sports"} ]</b> } }
</pre>
<p> OR </p> <pre><span class="comment">// sample template object with list object and type property</span>
*** REQUEST *** POST ... { "template": { <b>"data" : [ {"name": "interests", "value": "music"} ]</b> } }
</pre>
</section> <!-- /template object --> </section> <!-- /list --> <section id="object-status"> <h3>2.2. status</h3> <p> The <a href="#object-status" class="keyword">status</a> object is an OPTIONAL child property of the <a href="http://amundsen.com/media-types/collection/format/#objects-collection">collection</a> object. There MUST NOT be more than one <a href="#object-status" class="keyword">status</a> object in a document. It is a top-level document property </p> <p> The <a href="#object-status" class="keyword">status</a> object MAY contain any of two possible properties: <a href="http://amundsen.com/media-types/collection/format/#properties-code">code</a> (OPTIONAL), <a href="http://amundsen.com/media-types/collection/format/#properties-message">message</a> (REQUIRED). </p> <p> The <a href="#object-status" class="keyword">status</a> object's purpose is to fulfill requirements defined by HTTP <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.3">202 Accepted</a> status code. </p> <pre><span class="comment">// sample payment data submission request</span>
***REQUEST*** POST /payments HTTP/1.1 Host: service.com Content-Type: application/vnd.collection.next+json Content-Length: ... { "template": { <b>"data": [ {"name": "name", "John Doe"}, {"name": "email", "value": "john@doe.com"}, {"name": "creditcard", "value": 41111111111111}, {"name": "cvv2", "value": 123} ]</b> } }
</pre>
<pre><span class="comment">// sample payment data submission response</span>
***RESPONSE*** HTTP/1.1 <b>202 Accepted</b> Location: http://service.com/payments/8888 Content-Type: application/vnd.collection.next+json Content-Length: ... { "collection": { "version": 1.0 "href": "http://service.com/payments/8888", <b>"status": { "code": "inprogress", "message": "Payment is being processed" }</b> } }
</pre>
</section> <!-- /status --> <section id="object-method"> <h4>2.3. method</h3> <p> The <a href="#object-method" class="keyword">method</a> object represents list of all supported HTTP methods which can be potentially used for manipulating documents. This is an OPTIONAL object and is a child property of of the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <p> The <a href="#object-method" class="keyword">method</a> object SHOULD have an <a href="#array-options" class="keyword">options</a> array. </p> <pre><span class="comment">// sample method object</span>
{ "template": { <b>"method": { "options": [ARRAY] }</b>, "data": [ARRAY] } }
</pre>
<p> If the <a href="#object-method" class="keyword">method</a> object presents, it's <a href="#array-options" class="keyword">options</a> array SHOULD only contain any of HTTP <code>POST</code>, <code>PUT</code> and <code>PATCH</code> methods which SHOULD be used by clients for manipulating particular collection <a href="http://amundsen.com/media-types/collection/format/#arrays-items">items</a>. </p> <pre><span class="comment">// sample method object, only POST method is allowed</span>
{ "template": { "method": { <b>"options": [ {"value": "POST", "prompt": "Create Entry"} ]</b> }, "data": [ARRAY] } }
</pre>
<p>OR</p> <pre><span class="comment">// sample method object, PUT and PATCH methods are allowed</span>
{ "template": { "method": { <b>"options": [ {"value": "PUT", "prompt": "Replace Entry"}, <span class="comment">// replace entire resource</span> {"value": "PATCH", "prompt": "Modify Entry"} <span class="comment">// or modify resource partially</span> ]</b> }, "data": [ARRAY] } }
</pre>
<p>OR</p> <pre><span class="comment">// sample method object, only POST method is allowed</span>
{ "template": { "method": { <b>"options": [ {"value": "PATCH", "prompt": "Modify Entry"} <span class="comment">// only partial updates of resource is supported</span> ]</b> }, "data": [ARRAY] } }
</pre>
<p> Support of HTTP's <code>GET</code> and <code>HEAD</code> methods SHOULD be always assumed by clients. </p> </section><!-- /method --> <section id="object-enctype"> <h3>2.4. enctype</h3> <p> The <a href="#object-method" class="keyword">enctype</a> object represents a list of all supported content types other than <code>application/vnd.collection.next+json</code> which potentially MAY be accepted by server for write requests. This is an OPTIONAL object and is a child property of of the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <p> The <a href="#object-enctype" class="keyword">enctype</a> object SHOULD have an <a href="#array-options" class="keyword">options</a> array. </p> <pre><span class="comment">// sample method object</span>
{ "template": { "method": { "options": [ARRAY] }, <b>"enctype": { "options": [ {"value": "application/x-www-form-urlencoded", "prompt": ""} ] },</b> "data": [ARRAY] } }
</pre>
<p> Translation rules to other types MUST be defined by service implementors. Current specification only defines translation rules for <code>application/x-www-form-urlencoded</code> content type(see. <a href="#translating-to-x-www-form-urlencoded">Translating to application/x-www-form-urlencoded</a>). </p> <p> Despite the provided list of other supported content types, support for <code>application/vnd.collection.next+json</code> format MUST be always assumed by clients and services. </p> </section><!-- /enctype --> </section> <!-- /objects --> <section> <h2 id="arrays">3. Arrays</h2> <p> An array is an ordered sequence of zero or more values. </p> <p> Extension defines set of new arrays. These are: <a href="#array-options" class="keyword">options</a> and <a href="#array-messages" class="keyword">messages</a>. </p> <section id="array-options"> <h4>3.1. options</h4> <p> The <a href="#array-options" class="keyword">options</a> array MAY be a child property of the <a href="#object-list" class="keyword">list</a> and <a href="#object-method" class="keyword">method</a> objects. </p> <p> The <a href="#array-options" class="keyword">options</a> array SHOULD contain one or more anonymous objects. Each object MAY have any of two possible properties: <a href="http://amundsen.com/media-types/collection/format/#properties-value">value</a> (REQUIRED) and <a href="http://amundsen.com/media-types/collection/format/#properties-prompt">prompt</a> (OPTIONAL). </p> <pre><span class="comment">// sample options array</span>
{ "template": { "data": [ {"name": STRING, "value": 0, "prompt": STRING, <b>"list:" { "options": [ {"value": VALUE, "prompt": STRING}, ... {"value": VALUE} ] }</b>} ] } }
</pre>
</section> <!-- /options --> <section id="array-messages"> <h3>3.2. messages</h3> <p> The <a href="#array-messages" class="keyword">messages</a> array is a child property of the <a href="http://amundsen.com/media-types/collection/format/#objects-error">error</a> object property. </p> <p> The <a href="#array-messages" class="keyword">messages</a> array SHOULD contain one or more anonymous objects. Each object MAY have any of three possible properties: <a href="http://amundsen.com/media-types/collection/format/#properties-code">code</a> (OPTIONAL), <a href="http://amundsen.com/media-types/collection/format/#properties-name">name</a> (OPTIONAL) and <a href="http://amundsen.com/media-types/collection/format/#properties-message">message</a> (REQUIRED). </p> <pre><span class="comment">// sample messages array</span>
"error": { "code": STRING, <b>"messages": [ { "code": STRING, "name": STRING, "message": STRING } ... { "name": STRING, "message": STRING } ... { "message": STRING } ]</b> }
</pre>
</section> <!-- /messages --> </section> <!-- /Arrays --> <section id="properties"> <section> <h2>4. Properties</h2> <p> Properties represent individual name/value pairs for objects within <a href="http://amundsen.com/media-types/collection/format/">Collection+JSON</a> documents. </p> <p> Extension introduces several extra properties, these are: the <a href="#property-type" class="keyword">type</a> property which meaning depends on the enclosing object, the <a href="#property-multiple" class="keyword">multiple</a>, the <a href="#property-default" class="keyword">default</a>, and the <a href="#property-required" class="keyword">required</a>. </p> </section> <section id="property-type"> <h3>4.1. type</h3> <p> The <a href="#property-type" class="keyword">type</a> is an OPTIONAL property and MAY be a child property of the <a href="http://amundsen.com/media-types/collection/format/#arrays-links">links</a> array elements and the <a href="http://amundsen.com/media-types/collection/format/#arrays-data">data</a> array elements when part of the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> and <a href="http://amundsen.com/media-types/collection/format/#arrays-queries">queries</a> array. </p> <p> It SHOULD be a <a href="http://amundsen.com/media-types/collection/format/#type-string">STRING</a> data type. </p> <section id="links-type"> <h4>4.1.1. Using type property with links array elements</h4> <p> When used with the <a href="http://amundsen.com/media-types/collection/format/#arrays-links">links</a> array elements the value SHOULD be a standard MIME type. If the <a href="#property-type" class="keyword">type</a> property does not appear on a <a href="http://amundsen.com/media-types/collection/format/#arrays-links">links</a> array element, it should be assumed to be set to <code>application/vnd.collection.next+json</code>. </p> <pre><span class="comment">// sample links array</span>
{ "version": "1.0", "href": URI, "items": [ { "href": URI, "data": [ARRAY], <b>"links": [ {"href": URI, "rel": STRING, "prompt": STRING, "type": "image/png"}, {"href": URI, "rel": STRING, "prompt": STRING, "type": "image/jpeg"}, {"href": URI, "rel": STRING, "prompt": STRING, "type": "audio/mpeg3"}, {"href": URI, "rel": STRING, "prompt": STRING, "type": "application/rss+xml"}, ... {"href": URI, "rel": STRING, "prompt": STRING} ]</b> } ] }
</pre>
</section> <!-- /using with links --> <section id="links-data"> <h4>4.1.2. Using type property with data array elements</h4> <p> By introducing possibility to explicitly indicate desired data types for the input objects, extension addresses several important issues: </p> <ul> <li> <p> Strengthen semantics of input objects. </p> </li> <li> <p> By relying on commonly recognized types protect clients from implementing input processing logic relevant to only particular service format. </p> </li> <li> <p>Possibility to define agreed validation strategies on both - service and client sides.</p> </li> <li> <p>Reduce communication between service and client by making <a href="http://amundsen.com/media-types/collection/format/#arrays-data">data</a> array elements more self contained and self explanatory.</p> </li> <li> <p>Improve interoperability between heterogenous platforms(i.e. statically typed vs dynamically typed languages) without introducing additional complexity.</p> </li> <li> <p> By reducing need to describe types of the input objects somewhere else, minimize hardcoding in service clients. </p> </li> <li> <p> Improve rendering options in client applications. Client applications MAY determine rendering strategy by relying on the value of the <a href="#property-type" class="keyword">type</a> property and use most appropriate input controls in order to increase quality of interaction between application and user. </p> </li> </ul> <p> Table below describes supported HTML5 input types which service implementors and clients MAY user in order to describe and determine meaning of the input objects: </p> <table border="1"> <thead> <tr> <th>Type</th> <th>State(HTML5)</th> <th>Data Type(HTML5)</th> <th>Data Type(Collection+JSON)</th> </tr> </thead> <tbody> <tr> <td><code>number</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#number-state-type-number"> Number </a> </td> <td>A numerical value</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-number"> NUMBER </a> </td> </tr> <tr> <td><code>email</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#e-mail-state-type-email"> E-mail </a> </td> <td>An e-mail address</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> <tr> <td><code>url</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#url-state-type-url"> URL </a> </td> <td>An absolute URL</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> <tr> <td><code>date</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#date-state-type-date"> Date </a> </td> <td>A date (year, month, day) with no time zone</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> <tr> <td><code>datetime</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#date-and-time-state-type-datetime"> Date and Time </a> </td> <td>A date and time (year, month, day, hour, minute, second, fraction of a second) <br>with the time zone set to UTC</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> <tr> <td><code>month</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#month-state-type-month"> Month </a> </td> <td>A date consisting of a year and a month with no time zone</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> <tr> <td><code>tel</code></td> <td> <a href="http://www.w3.org/TR/html5/states-of-the-type-attribute.html#telephone-state-type-tel"> Telephone </a> </td> <td>Text with no line breaks</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-string"> STRING </a> </td> </tr> </tbody> </table> <p> Below is the example data array using HTTP5 type attribute values for specifying input object type: </p> <pre><span class="comment">// sample usage of type property in the data array</span>
{ "template": { <b>"data": [ {"name": STRING, "type": "number", "prompt": STRING}, <span class="comment">// NUMBER type</span> {"name": STRING, "type": "email", "prompt": STRING}, <span class="comment">// email STRING type</span> {"name": STRING, "type": "url", "prompt": STRING}, <span class="comment">// url STRING type</span> {"name": STRING, "type": "date", "prompt": STRING}, <span class="comment">// date STRING type</span> {"name": STRING, "type": "datetime", "prompt": STRING}, <span class="comment">// datetime STRING type</span> {"name": STRING, "type": "month", "prompt": STRING}, <span class="comment">// month STRING type</span> {"name": STRING, "type": "tel", "prompt": STRING} <span class="comment">// telephone STRING type</span> ]</b> } }
</pre>
<p> Additionally extension specification defines two explicit data types <code>integer</code> and <code>boolean</code>. Table below summarizes both of these types: </p> <table border="1"> <thead> <tr> <th>Type</th> <th>Description</th> <th>Data Type(Collection+JSON)</th> </tr> </thead> <tbody> <tr> <td><code>integer</code></td> <td>An integer value. When the type is specified any signed integer value SHOULD be used as a value of the <a href="http://amundsen.com/media-types/collection/format/#properties-value">value</a> property. </td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-number"> NUMBER </a> </td> </tr> <tr> <td><code>boolean</code></td> <td>A boolean value. When the type is specified any of two <code>true</code> or <code>false</code> literal values MUST be used as a value of the <a href="http://amundsen.com/media-types/collection/format/#properties-value">value</a> property.</td> <td> <a href="http://amundsen.com/media-types/collection/format/#type-number"> VALUE </a> </td> </tr> </tbody> </table>
<pre><span class="comment">// sample default value usage in the data array</span>
{ "template": { <b>"data": [ {"name": STRING, "prompt": STRING}, <span class="comment">// no type specified, any VALUE is legal</span> {"name": STRING, "value": 0, "prompt": STRING, "type": "integer"}, <span class="comment">// integer type</span> {"name": STRING, "value": false, "prompt": STRING, "type": "boolean"} <span class="comment">// boolean type</span> ]</b> } }
</pre>
</section> <!-- /using with data --> </section> <section id="property-multiple"> <h3>4.2. multiple</h3> <p> The <a href="#property-multiple" class="keyword">multiple</a> is an OPTIONAL property and MAY be a child property of the <a href="#object-list" class="keyword">list</a> object. </p> <p> It SHOULD be a <code>boolean</code> type and MAY only be specified to boolean <code>true</code> or <code>false</code>. </p> <pre><span class="comment">// sample usage of multiple property</span>
{ "queries": [ { ... "data" : [ { "name": "gender", <b>"list": { "multiple": true, "options": [ {"value": "female", "prompt": "Female"}, {"value": "male", "prompt": "Male"} ] }</b> } ] } ] }
</pre>
</section> <!-- /multiple --> <section id="property-default"> <h3>4.3. default</h3> <p> The <a href="#property-default" class="keyword">default</a> is an OPTIONAL property and MAY be a child property of the <a href="#object-list" class="keyword">list</a> object. </p> <p> It's value SHOULD be specified from one of the <a href="#array-options" class="keyword">options</a> array elements <a href="http://amundsen.com/media-types/collection/format/#properties-value">value</a> property. </p> <pre><span class="comment">// sample usage of default property</span>
{ "queries": [ { ... "data" : [ { "name": "gender", <b>"list": { "multiple": true, "default": "female", <span class="comment">// indicates default value</span> "options": [ {"value": "female", "prompt": "Female"}, {"value": "male", "prompt": "Male"} ] }</b> } ] } ] }
</pre>
</section> <section id="property-required"> <h3>4.3. required</h3> <p> The <a href="#property-required" class="keyword">required</a> is an OPTIONAL property and MAY be a child property of the <a href="http://amundsen.com/media-types/collection/format/#arrays-data">data</a> array elements. </p> <p> It SHOULD be a <code>boolean</code> type and MAY only be specified to boolean <code>true</code> or <code>false</code>. </p> <pre><span class="comment">// sample usage of the required property in the data array</span>
{ "template": { "data": [ {"name": STRING, "type": "number", "prompt": STRING, <b>"required": true</b>}, {"name": STRING, "type": "email", "prompt": STRING, <b>"required": true</b>}, {"name": STRING, "type": "url", "prompt": STRING, <b>"required": false</b>}, {"name": STRING, "type": "date", "prompt": STRING}, {"name": STRING, "type": "datetime", "prompt": STRING, <b>"required": true</b>}, {"name": STRING, "type": "month", "prompt": STRING}, {"name": STRING, "type": "tel", "prompt": STRING} ] } }
</pre>
</section> <!-- /required --> </section> <!-- /properties --> <section id="relations"> <section> <h2>5. Link Relations</h2> <p> Link relations can be used to annotate <a href="http://amundsen.com/media-types/collection/format/#arrays-links">links</a> array elements. </p> <p> Specification defines one new link relation value. </p> </section> <section id="relation-form"> <h3>5.1. form</h3> <p> The target IRI points to a resource that is a representation of a valid write form(create or edit) for the data represented by the context IRI. </p> <p> This is a generic relation type and doesn't necessarily refer to the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <p> When included in a resource which represents a collection, the <a href="#relation-form" class="keyword">form</a> link relation identifies a target resource that represents the form for adding a new member to the context collection. </p> <pre><span class="comment">// sample form relation use</span>
<b>GET /news</b> HTTP/1.1 Host: example.org Accept: application/vnd.collection.next+json { "collection": { "version": 1.0 "href": URI, "items": [ {OBJECT}, {OBJECT}, ... {OBJECT} ], "links": [ <b>{ "rel": "form", "href": URI, "prompt": "Add new item..." }</b> ] } }
</pre>
<p> In the example above <code>rel="form"</code> indicates that dereferencing of the URI SHOULD return representation of a valid create form. In this particular case the <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <p> When included in a resource which represents a member of a collection, the <a href="#relation-form" class="keyword">form</a> link relation identifies a target resource that represents a pre-populated form for editing the context resource. </p> <p> When the <code>form</code> relation value is used inside the <a href="http://amundsen.com/media-types/collection/format/#array-items">item</a> object, dereferencing of the URI SHOULD return the pre-populated valid <a href="http://amundsen.com/media-types/collection/format/#objects-template">template</a> object. </p> <pre><span class="comment">// sample form relation use</span>
<b>GET /news/12345</b> HTTP/1.1 Host: example.org Accept: application/vnd.collection.next+json { "collection": { "version": 1.0 "href": "http://example.org/news", "items": [ { "href": "http://example/org/news/12345", "data": [ARRAY], "links": [ <b>{ "rel": "form", "href": "http://example/org/news/12345/edit-form", "prompt": "Edit item..." }</b> ] }, {OBJECT}, ... {OBJECT} ], } }
</pre>
<p> As far as the <code>form</code> relation value is intentionally generic service implementors MAY support various types of forms. Different types of forms SHOULD be indicated by the <a href="#property-type">type</a> property value in links array elements. </p> <pre><span class="comment">// sample form relation use</span>
<b>GET /news</b> HTTP/1.1 Host: example.org Accept: application/vnd.collection.next+json { "collection": { "version": 1.0 "href": URI, "items": [ARRAY], "links": [ <b>{ "rel": "form", "href": URI, "type": "application/xhtml+xml", "prompt": "Add new item..." }</b> ] } }
</pre>
</section> </section> <!-- /link relations --> <section id="translating-to-x-www-form-urlencoded"> <h3>6. Translating to application/x-www-form-urlencoded</h4> <p> One of the goals of this specification is to define clear ways for translating content for update requests from <code>application/vnd.collection.next+json</code> to other formats. </p> <p> Current specification defines translation rules only for <code>application/vnd.collection.next+json</code> to <code>application/x-www-form-urlencoded</code>. </p> <p> Translation rules to other formats MUST be defined by service implementors. Supported content types other than <code>application/vnd.collection.next+json</code> SHOULD be provided through <a href="#object-enctype" class="keyword">enctype</a> object. </p> <p> Translation rules to to <code>application/x-www-form-urlencoded</code> are as follows: </p> <ul> <li> <p><code>null</code> values MUST be converted to empty strings <code>""</code>.</p> </li> <li> <p><code>boolean</code> values MUST be converted to <code>integer</code> <code>0</code> and <code>1</code> correspondingly.</p> </li> <li> <p>Encoding of name/value pairs MUST conform to <a href="http://tools.ietf.org/html/rfc3986">RFC3986</a> and MUST be properly implemented by clients.</p> </li> </ul> <p> Below is the example implemented in pure JavaScript for translating <a href="#array-data" class="keyword">data</a> array to <code>application/x-www-form-urlencoded</code> format. </p> <pre>
/** * encodeURIComponent() function is not 100% compatible with * RFC3986 http://www.faqs.org/rfcs/rfc3986.html */ function</span> encodeRFC3986</span>(value) {
return</span> encodeURIComponent</span>(value) . replace</span>( /!/g</span>, "%21"</span>) . replace</span>( /</span> \*</span> /g</span>, "%2A"</span>) . replace</span>( /</span> \(</span> /g</span>, "%28"</span>) . replace</span>( /</span> \)</span> /g</span>, "%29"</span>) . replace</span>( /'/g</span>, "%27"</span>);
}
function</span> translateToFormUrlEncoded</span>(data) {
var</span> buffer = [];
for</span> </span>( var</span> i = 0</span>; i < data.length; i++) { var</span> input = data[i]; var</span> name = input.name; var</span> value = input.value; if</span> </span>(value === null) { <em> // convert null value to empty string
</span></em> value = ''</span>;
} else</span> if</span> </span>( typeof</span> value === "boolean"</span>) { <em> // convert boolean value to integer 0 or 1
</span></em> value = Number</span>(value);
}
buffer. push</span>( encodeRFC3986</span>(name) + "="</span> + encodeRFC3986</span>(value)); }
return</span> buffer. join</span>( "&"</span>);
}
var</span> data = [
{ "name"</span>: "first-name"</span>, "value"</span>: "John"</span>}, { "name"</span>: "last-name"</span>, "value"</span>: "Doe"</span>}, { "name"</span>: "email"</span>, "value"</span>: "john@doe.com"</span>}, { "name"</span>: "website"</span>, "value"</span>: "http://john.doe.com"</span>}, { "name"</span>: "age"</span>, "value"</span>: 37</span>}, { "name"</span>: "interests"</span>, "value"</span>: "music"</span>}, { "name"</span>: "interests"</span>, "value"</span>: "sports"</span>}, { "name"</span>: "interests"</span>, "value"</span>: "cars"</span>}, { "name"</span>: "subscribe"</span>, "value"</span>: false</span>}
];
<em> convert data array to application/x-www-form-urlencoded </span></em> var</span> postData = translateToFormUrlEncoded</span>(data); </div></div> </pre> <pre> encoded contents of resulting postData variable</span> <code> first-name=John&last-name=Doe&email=john%40doe.com&website=http%3A%2F%2Fjohn.doe.com&age=37&interests=music&interests=sports&interests=cars&subscribe=0 </code></pre> </section><!– /translating to form urlencoded –> <section id=“acknowledgements”> <h2>7. Acknowledgements</h2> <p>Special thanks to <a href=“http://amundsen.com/”>Mike Amundsen</a> for insightful advices and permissions to use <a href=“#”>Collections+JSON</a> specification as a reference material.</p> </section> <!– /acknowledgements –> <section> <h2 id=“references”>8. References</h2> <ul> <li><a href=“http://www.w3.org/TR/html5/the-input-element.html”>HTML5 - 4.10.7 The input element</a></li> <li><a href=“http://amundsen.com/media-types/collection/format/”>Collection+JSON - Document Format</a></li> <li><a href=“http://tools.ietf.org/html/rfc2119”>RFC2119 - Key words for use in RFCs to Indicate Requirement Levels</a></li> <li><a href=“http://www.iana.org/assignments/link-relations/link-relations.xml”>IANA Link Relations</a></li> <li><a href=“http://tools.ietf.org/html/rfc5988”>RFC5988 - Web Linking</a></li> <li><a href=“http://tools.ietf.org/html/rfc4627”>RFC2627 - The application/json Media Type for JavaScript Object Notation (JSON)</a></li> <li><a href=“http://tools.ietf.org/html/rfc5789”>RFC5789 - PATCH Method for HTTP</a></li> </ul> </section> <!– /references –> </section> </body> </html>