<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: REST/HTTP Service Versioning (Response to Jean-Jacques Dubray)</title>
	<atom:link href="http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/feed/" rel="self" type="application/rss+xml" />
	<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/</link>
	<description>… and there is much to be learned</description>
	<lastBuildDate>Sun, 06 May 2012 15:09:26 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
	<item>
		<title>By: Andy Dennie</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85812</link>
		<dc:creator>Andy Dennie</dc:creator>
		<pubDate>Tue, 27 Mar 2012 13:14:09 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85812</guid>
		<description>While pondering the approach discussed above, one more use case came to mind which it nicely handles - experimental (beta) releases of new representation versions.  For example, suppose that version 1.12 is the latest supported version for general use, but version 1.13 is available for beta testers.  A client specifying &quot;application/vnd.myapp-v1+xml;level=5&quot; gets version 1.5, or nothing (a 406).  A client specifying &quot;application/vnd.myapp-v1+xml&quot; (i.e. no &quot;level&quot; parameter) gets version 1.12, because the absence of the &quot;level&quot; parameter means &quot;I accept any 1.x&quot;, and thus the server is free to return any 1.x version it chooses, in this case the most recent generally available version.  However, a beta client could specify &quot;application/vnd.myapp-v1+xml;level=13&quot; and get that version specifically.  Nice!</description>
		<content:encoded><![CDATA[<p>While pondering the approach discussed above, one more use case came to mind which it nicely handles &#8211; experimental (beta) releases of new representation versions.  For example, suppose that version 1.12 is the latest supported version for general use, but version 1.13 is available for beta testers.  A client specifying &#8220;application/vnd.myapp-v1+xml;level=5&#8243; gets version 1.5, or nothing (a 406).  A client specifying &#8220;application/vnd.myapp-v1+xml&#8221; (i.e. no &#8220;level&#8221; parameter) gets version 1.12, because the absence of the &#8220;level&#8221; parameter means &#8220;I accept any 1.x&#8221;, and thus the server is free to return any 1.x version it chooses, in this case the most recent generally available version.  However, a beta client could specify &#8220;application/vnd.myapp-v1+xml;level=13&#8243; and get that version specifically.  Nice!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andy Dennie</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85811</link>
		<dc:creator>Andy Dennie</dc:creator>
		<pubDate>Mon, 26 Mar 2012 14:53:35 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85811</guid>
		<description>Peter, first off, thanks very much for your blog posts on this subject; they&#039;re really helping me think through things.  One question that&#039;s not clear to me from your examples... would you use different media types for different resources, or the same one?  An example will make this clearer.  Say my service exposes Customer resources and Order resources.  I can see two possibilities.
1) the media type &quot;application/vnd.myapp-v1+xml;level=12&quot; can be used for both Customer AND Order resources, and in each case simply means the 12th level of the 1st version of the XML representation for that resource.
2) there would be distinct media types &quot;application/vnd.myapp.customer-v1+xml;level=12&quot; and &quot;application/vnd.myapp.order-v1+xml;level=12&quot;, each to be used with the corresponding resource.

It seems to me that approach #1 could work, since the resource is identified by the URI and therefore doesn&#039;t have to be part of the media type.  On the other hand, it feels funny for a media type to be so loosely defined that it could be applied to two representations that looking nothing alike.</description>
		<content:encoded><![CDATA[<p>Peter, first off, thanks very much for your blog posts on this subject; they&#8217;re really helping me think through things.  One question that&#8217;s not clear to me from your examples&#8230; would you use different media types for different resources, or the same one?  An example will make this clearer.  Say my service exposes Customer resources and Order resources.  I can see two possibilities.<br />
1) the media type &#8220;application/vnd.myapp-v1+xml;level=12&#8243; can be used for both Customer AND Order resources, and in each case simply means the 12th level of the 1st version of the XML representation for that resource.<br />
2) there would be distinct media types &#8220;application/vnd.myapp.customer-v1+xml;level=12&#8243; and &#8220;application/vnd.myapp.order-v1+xml;level=12&#8243;, each to be used with the corresponding resource.</p>
<p>It seems to me that approach #1 could work, since the resource is identified by the URI and therefore doesn&#8217;t have to be part of the media type.  On the other hand, it feels funny for a media type to be so loosely defined that it could be applied to two representations that looking nothing alike.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Piers Lawson</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85803</link>
		<dc:creator>Piers Lawson</dc:creator>
		<pubDate>Thu, 01 Mar 2012 23:29:15 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85803</guid>
		<description>Ah... apologies, your q factor is present... just scrolled off the screen!</description>
		<content:encoded><![CDATA[<p>Ah&#8230; apologies, your q factor is present&#8230; just scrolled off the screen!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Piers Lawson</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85802</link>
		<dc:creator>Piers Lawson</dc:creator>
		<pubDate>Thu, 01 Mar 2012 23:26:16 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85802</guid>
		<description>A minor point, your example of an Accept header taking alternate content types and then stating version 2 is its preference is slightly wrong. Without a q factor in there, they all default to q=1... which means the server is free to serve whichever version it likes. The HTP spec does not say what should happen in this case. In my framework I default to the order of the Accept types, but as Microsoft&#039;s web api team blindly state, they don&#039;t have to do this so serving their default is perfectly legal:

http://aspnet.uservoice.com/forums/147201-web-api/suggestions/2620003-use-order-of-entries-in-the-accept-header-for-entr?tracking_code=519af301292bc3a981a99d51a6231ba5

I believe they are being short sighted, but the best way to guarentee you get the best possible representation is to use the q factor.

Hopefully others will raise this with Microsoft as well... I tried here also:

http://forums.asp.net/t/1771514.aspx/1?Accept+type+ordering</description>
		<content:encoded><![CDATA[<p>A minor point, your example of an Accept header taking alternate content types and then stating version 2 is its preference is slightly wrong. Without a q factor in there, they all default to q=1&#8230; which means the server is free to serve whichever version it likes. The HTP spec does not say what should happen in this case. In my framework I default to the order of the Accept types, but as Microsoft&#8217;s web api team blindly state, they don&#8217;t have to do this so serving their default is perfectly legal:</p>
<p><a href="http://aspnet.uservoice.com/forums/147201-web-api/suggestions/2620003-use-order-of-entries-in-the-accept-header-for-entr?tracking_code=519af301292bc3a981a99d51a6231ba5" rel="nofollow">http://aspnet.uservoice.com/forums/147201-web-api/suggestions/2620003-use-order-of-entries-in-the-accept-header-for-entr?tracking_code=519af301292bc3a981a99d51a6231ba5</a></p>
<p>I believe they are being short sighted, but the best way to guarentee you get the best possible representation is to use the q factor.</p>
<p>Hopefully others will raise this with Microsoft as well&#8230; I tried here also:</p>
<p><a href="http://forums.asp.net/t/1771514.aspx/1?Accept+type+ordering" rel="nofollow">http://forums.asp.net/t/1771514.aspx/1?Accept+type+ordering</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Peter Williams</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85752</link>
		<dc:creator>Peter Williams</dc:creator>
		<pubDate>Mon, 14 Nov 2011 02:47:21 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85752</guid>
		<description>Mattias J, a &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7&quot; rel=&quot;nofollow&quot;&gt;406 Not Acceptable&lt;/a&gt; is the proper response in that situation.  Preferably with a body that describes what media types are supported.
</description>
		<content:encoded><![CDATA[<p>Mattias J, a <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7" rel="nofollow">406 Not Acceptable</a> is the proper response in that situation.  Preferably with a body that describes what media types are supported.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mattias J</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-85747</link>
		<dc:creator>Mattias J</dc:creator>
		<pubDate>Mon, 24 Oct 2011 09:42:59 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-85747</guid>
		<description>Is there any recommendation how to respond to a request accepting only version 1, after there has been an incompatible change that makes it impossible to produce a valid version 1 response?</description>
		<content:encoded><![CDATA[<p>Is there any recommendation how to respond to a request accepting only version 1, after there has been an incompatible change that makes it impossible to produce a valid version 1 response?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reda B.</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-83779</link>
		<dc:creator>Reda B.</dc:creator>
		<pubDate>Wed, 02 Jun 2010 17:29:53 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-83779</guid>
		<description>&lt;p&gt;I know this post is a bit old but, Jean Jaque :&lt;/p&gt;

&lt;blockquote&gt;
So in the beginning I started to with
/customer/{id}/contact

and now I have a
/customer/{id}/contacts
/customer/{id}/contacts/{number}
I also repurposed my original contact URI as the “primary contact”, but I did not like it so I also created a:
/customer/{id}/primaryContact
&lt;/blockquote&gt;

&lt;p&gt;There&#039;s always http redirects...
&lt;code&gt;
===&gt;
GET /customer/22/contact
Accept: application/vnd.myapp-v1+xml
&lt;===
301 MOVED PERMANENTLY
Location: /customer/{id}/primaryContact
===&gt;
GET /customer/22/primaryContact
Accept: application/vnd.myapp-v1+xml
&lt;===
200 OK
Content-Type: application/vnd.myapp-v1+xml
&lt;/code&gt;&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>I know this post is a bit old but, Jean Jaque :</p>
<blockquote><p>
So in the beginning I started to with<br />
/customer/{id}/contact</p>
<p>and now I have a<br />
/customer/{id}/contacts<br />
/customer/{id}/contacts/{number}<br />
I also repurposed my original contact URI as the “primary contact”, but I did not like it so I also created a:<br />
/customer/{id}/primaryContact
</p></blockquote>
<p>There&#8217;s always http redirects&#8230;<br />
<code><br />
===&gt;<br />
GET /customer/22/contact<br />
Accept: application/vnd.myapp-v1+xml<br />
&lt;===<br />
301 MOVED PERMANENTLY<br />
Location: /customer/{id}/primaryContact<br />
===&gt;<br />
GET /customer/22/primaryContact<br />
Accept: application/vnd.myapp-v1+xml<br />
&lt;===<br />
200 OK<br />
Content-Type: application/vnd.myapp-v1+xml<br />
</code></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: The Amazing Blog : Your Web Service Might Not Be RESTful If&#8230;</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-74871</link>
		<dc:creator>The Amazing Blog : Your Web Service Might Not Be RESTful If&#8230;</dc:creator>
		<pubDate>Mon, 20 Jul 2009 04:45:02 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-74871</guid>
		<description>&lt;p&gt;[...] surface of this topic. For more, Peter Williams has an excellent discussion of it here, here, and here. (disclaimer &amp;emdash; Peter is a former coworker and personal friend. This section and his posts [...]&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>[...] surface of this topic. For more, Peter Williams has an excellent discussion of it here, here, and here. (disclaimer &emdash; Peter is a former coworker and personal friend. This section and his posts [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jean-Jacques Dubray</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-52859</link>
		<dc:creator>Jean-Jacques Dubray</dc:creator>
		<pubDate>Fri, 23 May 2008 14:40:01 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-52859</guid>
		<description>&lt;p&gt;Ben:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;The Web’s approach introduces a triangle of methods, document types and URLs that each evolve as separately moving parts.&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don&#039;t think the architecture of the web ever considered &quot;versioning&quot; as a key design requirement. It kind of &quot;works&quot; with web pages. As soon as you live this trivial use case for &quot;connected systems&quot; I can only see issues.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;blockquote&gt;
    &lt;p&gt;A client issues a GET request with an Accept indicating the understood formats. The server knows how to pack the returned information into at least one of these, and responds.&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&#039;d like to point out that in a true versioning strategy,  the server should respond based on its own version. So if client 2.1 calls server 2.4, the response should be in 2.4 format. This is why forwards compatibility is so valuable because it prevents the server to have to operate all kinds of minor versions. Imagine a situation where you have 3 major version and 10 minor in each. How many versions are you going to operate/maintain? With forwards compatibility you only operate/maintain 3.&lt;/p&gt;

&lt;p&gt;sorry, I don&#039;t see the light, and again, I am trying. I live in a world where reuse, reliability, security (authorization), predictability... are the norm. I see so many holes in this approach that I don&#039;t see why I should spend any time investigating it. Now if your context does not require so much security, reliability, predictability... and you really need the kind of scalability that REST can give you, great, I am all for it. But please, don&#039;t mix and match these two context, as I mentioned you are creating a losing proposition for everyone involved.&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Ben:</p>
<blockquote>
<blockquote>
<p>The Web’s approach introduces a triangle of methods, document types and URLs that each evolve as separately moving parts.</p>
</blockquote>
</blockquote>
<p>I don&#8217;t think the architecture of the web ever considered &#8220;versioning&#8221; as a key design requirement. It kind of &#8220;works&#8221; with web pages. As soon as you live this trivial use case for &#8220;connected systems&#8221; I can only see issues.</p>
<blockquote>
<blockquote>
<p>A client issues a GET request with an Accept indicating the understood formats. The server knows how to pack the returned information into at least one of these, and responds.</p>
</blockquote>
</blockquote>
<p>I&#8217;d like to point out that in a true versioning strategy,  the server should respond based on its own version. So if client 2.1 calls server 2.4, the response should be in 2.4 format. This is why forwards compatibility is so valuable because it prevents the server to have to operate all kinds of minor versions. Imagine a situation where you have 3 major version and 10 minor in each. How many versions are you going to operate/maintain? With forwards compatibility you only operate/maintain 3.</p>
<p>sorry, I don&#8217;t see the light, and again, I am trying. I live in a world where reuse, reliability, security (authorization), predictability&#8230; are the norm. I see so many holes in this approach that I don&#8217;t see why I should spend any time investigating it. Now if your context does not require so much security, reliability, predictability&#8230; and you really need the kind of scalability that REST can give you, great, I am all for it. But please, don&#8217;t mix and match these two context, as I mentioned you are creating a losing proposition for everyone involved.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Benjamin Carlyle</title>
		<link>http://barelyenough.org/blog/2008/05/resthttp-service-versioning-reponse-to-jean-jacques-dubray/comment-page-1/#comment-52856</link>
		<dc:creator>Benjamin Carlyle</dc:creator>
		<pubDate>Fri, 23 May 2008 13:20:59 +0000</pubDate>
		<guid isPermaLink="false">http://pezra.barelyenough.org/blog/?p=341#comment-52856</guid>
		<description>&lt;p&gt;Jean-Jacques,&lt;/p&gt;

&lt;p&gt;You aren&#039;t actually versioning a service or a resource with this content-type setting. You are setting the version of the document type.&lt;/p&gt;

&lt;p&gt;The model here is a heterogeneous one. The assumption is that there might be five different server implementations and twelve client implementations, all with various kinds of jargonization (version forking as well as incrementing) to their protocols and document types. Any and all of these might have been upgraded or left at their original version over the lifetime of the architecture. The Web&#039;s approach introduces a triangle of methods, document types and URLs that each evolve as separately moving parts.&lt;/p&gt;

&lt;p&gt;Document types use must-ignore to encourage a certain fuzzyness of version that supports upgrade and some jargonization of a document type. For example, I could use a standard document type with a bit of extra information inserted for good measure. It will be understood in a limited context, but the rest of the document will still be understood universally. If I really exhaust the evolution path for a particular document type I come up with a new one an rely on content negotiation as per Peter&#039;s approach.&lt;/p&gt;

&lt;p&gt;In a true REST architecture both methods and document types are controlled. There is a limited number of ways that a particular schema of data is allowed to be encoded into, and every way that exists at a given time can be expected to be understood by the document recipient.&lt;/p&gt;

&lt;p&gt;A client issues a GET request with an Accept indicating the understood formats. The server knows how to pack the returned information into at least one of these, and responds. The client processes the document, extracting information according to its needs. Communication is achieved, and with the resource that the client intended. Versioning takes second place to heterogeneous evolution.&lt;/p&gt;

&lt;p&gt;See also my article on REST Rewiring: http://soundadvice.id.au/blog/2008/04/18#rest-rewiring&lt;/p&gt;
</description>
		<content:encoded><![CDATA[<p>Jean-Jacques,</p>
<p>You aren&#8217;t actually versioning a service or a resource with this content-type setting. You are setting the version of the document type.</p>
<p>The model here is a heterogeneous one. The assumption is that there might be five different server implementations and twelve client implementations, all with various kinds of jargonization (version forking as well as incrementing) to their protocols and document types. Any and all of these might have been upgraded or left at their original version over the lifetime of the architecture. The Web&#8217;s approach introduces a triangle of methods, document types and URLs that each evolve as separately moving parts.</p>
<p>Document types use must-ignore to encourage a certain fuzzyness of version that supports upgrade and some jargonization of a document type. For example, I could use a standard document type with a bit of extra information inserted for good measure. It will be understood in a limited context, but the rest of the document will still be understood universally. If I really exhaust the evolution path for a particular document type I come up with a new one an rely on content negotiation as per Peter&#8217;s approach.</p>
<p>In a true REST architecture both methods and document types are controlled. There is a limited number of ways that a particular schema of data is allowed to be encoded into, and every way that exists at a given time can be expected to be understood by the document recipient.</p>
<p>A client issues a GET request with an Accept indicating the understood formats. The server knows how to pack the returned information into at least one of these, and responds. The client processes the document, extracting information according to its needs. Communication is achieved, and with the resource that the client intended. Versioning takes second place to heterogeneous evolution.</p>
<p>See also my article on REST Rewiring: <a href="http://soundadvice.id.au/blog/2008/04/18#rest-rewiring" rel="nofollow">http://soundadvice.id.au/blog/2008/04/18#rest-rewiring</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>

