<?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>Commentaires sur : Versioning de services REST</title>
	<atom:link href="http://blog.octo.com/versioning-de-services-rest/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com/versioning-de-services-rest/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=versioning-de-services-rest</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Wed, 08 Feb 2012 14:30:47 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Par : JY Cr</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-4370</link>
		<dc:creator>JY Cr</dc:creator>
		<pubDate>Fri, 15 Jul 2011 22:40:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-4370</guid>
		<description>Pour continuer la discussion, ils en parlent ici aussi : http://www.la-grange.net/2011/07/14/api-version</description>
		<content:encoded><![CDATA[<p>Pour continuer la discussion, ils en parlent ici aussi : <a href="http://www.la-grange.net/2011/07/14/api-version" rel="nofollow">http://www.la-grange.net/2011/07/14/api-version</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Lecture de la semaine &#171; Un expresso sans sucre</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-4189</link>
		<dc:creator>Lecture de la semaine &#171; Un expresso sans sucre</dc:creator>
		<pubDate>Sun, 15 May 2011 19:09:49 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-4189</guid>
		<description>[...] Versioning des Services REST. Sur le Blog Octo, Benjamin Magan nous propose une stratégie pour le versioning des Services REST. La technique proposée est élégante et repose sur la négociation du contenu et l&#8217;entête &#171;&#160;Content-Type&#160;&#187;. Le client indique à l&#8217;aide cet entête, non seulement le format de représentation des données (XML, JSON, &#8230;) mais aussi la version du service qu&#8217;il utilise. De cette manière, l&#8217;URL reste inchangée ce qui est important avec des services REST. [...]</description>
		<content:encoded><![CDATA[<p>[...] Versioning des Services REST. Sur le Blog Octo, Benjamin Magan nous propose une stratégie pour le versioning des Services REST. La technique proposée est élégante et repose sur la négociation du contenu et l&#8217;entête &laquo;&nbsp;Content-Type&nbsp;&raquo;. Le client indique à l&#8217;aide cet entête, non seulement le format de représentation des données (XML, JSON, &#8230;) mais aussi la version du service qu&#8217;il utilise. De cette manière, l&#8217;URL reste inchangée ce qui est important avec des services REST. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : JY Cr</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-3931</link>
		<dc:creator>JY Cr</dc:creator>
		<pubDate>Thu, 10 Feb 2011 21:37:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-3931</guid>
		<description>2 petites remarques sur ce vieil article :

- Concernant la gestion de version via paramètre Header &quot;Accept&quot;, c&#039;est ce que préconise la norme HTTP ( http://tools.ietf.org/html/rfc2616#section-14.1 )
Mais la norme préconise plutôt l&#039;utilisation de la partie &quot;accept-extension&quot;. Ce qui donnerait dans l&#039;exemple du service :
 
GET http://.../albums/12133
Accept : application/vnd.octo.music+xml;level=1

Apache semble d&#039;ailleurs prendre en compte ce paramètre :
- &quot;Sélectionner les variantes possédant le paramètre de média &quot;level&quot; le plus élevé (utilisé pour préciser la version des types de média text/html).&quot; 
   http://httpd.apache.org/docs/current/content-negotiation.html
- &quot;level an integer specifying the version of the media type. For text/html this defaults to 2, otherwise 0.&quot;
   http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html 
  

- pour répondre à &quot;c&#039;est intestable automatiquement par un navigateur&quot;, si des solution comme l&#039;extension &quot;Poster&quot; n&#039;est pas envisageable, on peut envisager de mettre en œuvre le principe de surcharge via query String de la même manière que &quot;X-HTTP-Method-Override&quot;

A part ça ... concernant &quot;Dans un article futur nous pourrons décrire l’architecture technique/applicative impliquée par la gestion de versions via Accept Header.&quot; ... je n&#039;ai pas trouvé l&#039;article :)</description>
		<content:encoded><![CDATA[<p>2 petites remarques sur ce vieil article :</p>
<p>- Concernant la gestion de version via paramètre Header &laquo;&nbsp;Accept&nbsp;&raquo;, c&#8217;est ce que préconise la norme HTTP ( <a href="http://tools.ietf.org/html/rfc2616#section-14.1" rel="nofollow">http://tools.ietf.org/html/rfc2616#section-14.1</a> )<br />
Mais la norme préconise plutôt l&#8217;utilisation de la partie &laquo;&nbsp;accept-extension&nbsp;&raquo;. Ce qui donnerait dans l&#8217;exemple du service :</p>
<p>GET <a href="http://.../albums/12133" rel="nofollow">http://&#8230;/albums/12133</a><br />
Accept : application/vnd.octo.music+xml;level=1</p>
<p>Apache semble d&#8217;ailleurs prendre en compte ce paramètre :<br />
- &laquo;&nbsp;Sélectionner les variantes possédant le paramètre de média &laquo;&nbsp;level&nbsp;&raquo; le plus élevé (utilisé pour préciser la version des types de média text/html).&nbsp;&raquo;<br />
   <a href="http://httpd.apache.org/docs/current/content-negotiation.html" rel="nofollow">http://httpd.apache.org/docs/current/content-negotiation.html</a><br />
- &laquo;&nbsp;level an integer specifying the version of the media type. For text/html this defaults to 2, otherwise 0.&nbsp;&raquo;<br />
   <a href="http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html" rel="nofollow">http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html</a> </p>
<p>- pour répondre à &laquo;&nbsp;c&#8217;est intestable automatiquement par un navigateur&nbsp;&raquo;, si des solution comme l&#8217;extension &laquo;&nbsp;Poster&nbsp;&raquo; n&#8217;est pas envisageable, on peut envisager de mettre en œuvre le principe de surcharge via query String de la même manière que &laquo;&nbsp;X-HTTP-Method-Override&nbsp;&raquo;</p>
<p>A part ça &#8230; concernant &laquo;&nbsp;Dans un article futur nous pourrons décrire l’architecture technique/applicative impliquée par la gestion de versions via Accept Header.&nbsp;&raquo; &#8230; je n&#8217;ai pas trouvé l&#8217;article :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : OCTO talks ! &#187; Des alternatives aux bases de données relationnelles…</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1781</link>
		<dc:creator>OCTO talks ! &#187; Des alternatives aux bases de données relationnelles…</dc:creator>
		<pubDate>Wed, 11 Nov 2009 07:26:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1781</guid>
		<description>[...] possibilités de versionning plus simple puisque la signature sera [...]</description>
		<content:encoded><![CDATA[<p>[...] possibilités de versionning plus simple puisque la signature sera [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Georges Abidbol</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1294</link>
		<dc:creator>Georges Abidbol</dc:creator>
		<pubDate>Mon, 18 May 2009 17:34:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1294</guid>
		<description>A première vue, je ne suis pas vraiment fan d&#039;un module web &quot;routeur&quot;.
Je ne pense pas que ce soit de la responsabilité d&#039;un serveur d&#039;applications que de router une requête cliente vers une application web. A moins évidemment que ce choix soit justifié. C&#039;est à dire par exemple si la décision de routage est basée sur des règles complexes nécessitant un traitement ou l&#039;accès à des ressources ou des services particuliers...
Dans le cas cité par Dominique (déploiement de 2 applis web pour 2 versions différentes), la décision de routage s&#039;effectue à partir de l&#039;analyse d&#039;entêtes HTTP. Certes, c&#039;est au niveau applicatif que cela se passe, mais notre pauvre serveur d&#039;applications a sans doute autre chose à faire que de s&#039;occuper de ça.
Je refilerai plutôt le boulot à un reverse proxy, qui peut de façon plus efficace décider de router les requêtes vers la bonne version déployée sur notre besogneux serveur d&#039;application, délestant ainsi ce dernier.

C&#039;est un avis tout à fait personnel :)

C&#039;est un choix qui dépend largement du domaine fonctionnel : fréquences d&#039;apparition de nouvelles fonctions et/ou d&#039;évolutions, etc... Quoiqu&#039;il en soit, il arrive un moment où la mise à disposition et le maintien de trop de versions d&#039;un même service devient trop complexe. D&#039;où la nécessité sans doute de marquer certains services comme &quot;dépréciés&quot;, comme une manière de prévenir les clients que le service est amené à ne plus être supporté, et ainsi à les amener à upgrader vers une version plus récente du client rest.

Le sujet est vaste...</description>
		<content:encoded><![CDATA[<p>A première vue, je ne suis pas vraiment fan d&#8217;un module web &laquo;&nbsp;routeur&nbsp;&raquo;.<br />
Je ne pense pas que ce soit de la responsabilité d&#8217;un serveur d&#8217;applications que de router une requête cliente vers une application web. A moins évidemment que ce choix soit justifié. C&#8217;est à dire par exemple si la décision de routage est basée sur des règles complexes nécessitant un traitement ou l&#8217;accès à des ressources ou des services particuliers&#8230;<br />
Dans le cas cité par Dominique (déploiement de 2 applis web pour 2 versions différentes), la décision de routage s&#8217;effectue à partir de l&#8217;analyse d&#8217;entêtes HTTP. Certes, c&#8217;est au niveau applicatif que cela se passe, mais notre pauvre serveur d&#8217;applications a sans doute autre chose à faire que de s&#8217;occuper de ça.<br />
Je refilerai plutôt le boulot à un reverse proxy, qui peut de façon plus efficace décider de router les requêtes vers la bonne version déployée sur notre besogneux serveur d&#8217;application, délestant ainsi ce dernier.</p>
<p>C&#8217;est un avis tout à fait personnel :)</p>
<p>C&#8217;est un choix qui dépend largement du domaine fonctionnel : fréquences d&#8217;apparition de nouvelles fonctions et/ou d&#8217;évolutions, etc&#8230; Quoiqu&#8217;il en soit, il arrive un moment où la mise à disposition et le maintien de trop de versions d&#8217;un même service devient trop complexe. D&#8217;où la nécessité sans doute de marquer certains services comme &laquo;&nbsp;dépréciés&nbsp;&raquo;, comme une manière de prévenir les clients que le service est amené à ne plus être supporté, et ainsi à les amener à upgrader vers une version plus récente du client rest.</p>
<p>Le sujet est vaste&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Dominique Jocal</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1291</link>
		<dc:creator>Dominique Jocal</dc:creator>
		<pubDate>Fri, 15 May 2009 12:41:27 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1291</guid>
		<description>C&#039;est l&#039;autre sujet, très connexe certes, du multiversion côté implem; j&#039;ai des exemples soap ou rpc propriétaire à vous soumettre, peut être sont ils valides pour rest également? (hypothèse peut être fragile)

Première approche effectivement : même webapp; vu dans un système de réservation transport : 1 seul code qui supporte d&#039;être interrogé de 2 façons différentes, avec des bon vieux If organisés aux bon endroits (= pas trop!), et pleins de tests de non régression.

En l&#039;occurrence, le système offrait des fonctionnalités récentes aux clients de l&#039;ancienne API (ça ne changeait pas les apis des request ni des responses), donc le partage de code entre les 2 versions était nécessaire, et il avait été jugé plus facile de faire la maintenance sur un code unique.

Pas vu mais envisageable en théorie : déployer 2+1 webapp sur le cluster, la 3ième minuscule webapp contenant le code de routage côté serveur selon la version; pour le monde java, appeler le dispatcher fourni par le servlet context (me semble t il), en tout cas celui qui est global, qui permet de basculer vers n&#039;importe quel autre contexte url du serveur d&#039;app, sans revenir vers le client.

Enfin, il y a effectivement l&#039;approche de transformation de message par un intermédiaire type ESB; les grands fournisseurs de réservation fonctionnent beaucoup comme ça (encore une fois, en approche message proche rpc, mais j&#039;ai l&#039;impression que le sujet du multiversion côté implem est orthogonal, non ?)</description>
		<content:encoded><![CDATA[<p>C&#8217;est l&#8217;autre sujet, très connexe certes, du multiversion côté implem; j&#8217;ai des exemples soap ou rpc propriétaire à vous soumettre, peut être sont ils valides pour rest également? (hypothèse peut être fragile)</p>
<p>Première approche effectivement : même webapp; vu dans un système de réservation transport : 1 seul code qui supporte d&#8217;être interrogé de 2 façons différentes, avec des bon vieux If organisés aux bon endroits (= pas trop!), et pleins de tests de non régression.</p>
<p>En l&#8217;occurrence, le système offrait des fonctionnalités récentes aux clients de l&#8217;ancienne API (ça ne changeait pas les apis des request ni des responses), donc le partage de code entre les 2 versions était nécessaire, et il avait été jugé plus facile de faire la maintenance sur un code unique.</p>
<p>Pas vu mais envisageable en théorie : déployer 2+1 webapp sur le cluster, la 3ième minuscule webapp contenant le code de routage côté serveur selon la version; pour le monde java, appeler le dispatcher fourni par le servlet context (me semble t il), en tout cas celui qui est global, qui permet de basculer vers n&#8217;importe quel autre contexte url du serveur d&#8217;app, sans revenir vers le client.</p>
<p>Enfin, il y a effectivement l&#8217;approche de transformation de message par un intermédiaire type ESB; les grands fournisseurs de réservation fonctionnent beaucoup comme ça (encore une fois, en approche message proche rpc, mais j&#8217;ai l&#8217;impression que le sujet du multiversion côté implem est orthogonal, non ?)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Gilles S</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1290</link>
		<dc:creator>Gilles S</dc:creator>
		<pubDate>Fri, 15 May 2009 07:57:20 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1290</guid>
		<description>Merci pour ces posts, peut on pousser la reflexion plus loin? Pouvez vous également expliquer comment vous faites vivre les 2 versions de service coté serveur ?
Est-ce qu&#039;elles sont cote à cote dans la meme webapp ? Est-ce qu&#039;on fait une 2e webapp? Est-ce qu&#039;on sort la machine de guerre avec un bus qui transforme le format V1 en V2 ?
Pouvez vous svp faire part de vrais retours d&#039;experience pour certains cas?

Merci encore
Gilles S</description>
		<content:encoded><![CDATA[<p>Merci pour ces posts, peut on pousser la reflexion plus loin? Pouvez vous également expliquer comment vous faites vivre les 2 versions de service coté serveur ?<br />
Est-ce qu&#8217;elles sont cote à cote dans la meme webapp ? Est-ce qu&#8217;on fait une 2e webapp? Est-ce qu&#8217;on sort la machine de guerre avec un bus qui transforme le format V1 en V2 ?<br />
Pouvez vous svp faire part de vrais retours d&#8217;experience pour certains cas?</p>
<p>Merci encore<br />
Gilles S</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Benoit Guillou</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1284</link>
		<dc:creator>Benoit Guillou</dc:creator>
		<pubDate>Wed, 13 May 2009 12:18:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1284</guid>
		<description>Quelle classe Georges !
Le User Agent est en effet un autre moyen de préciser la version du service à attaquer sans triturer l&#039;URL de la ressource. Le champs Accept reste dans l&#039;absolu l&#039;attribut d&#039;entête HTTP à privilégier. 

Pour ce qui est de ta remarque Gabriel &#039;intestable par le navigateur&#039;, ce n&#039;est pas structurant dans la manière de penser les services REST. La testabilité du navigateur n&#039;est pas la killer feature de REST (surtout si tu ne testes que les GET). De plus avec un petit about:config tu peux tout à fait modifier ce champs ACCEPT. A noter que le plugin Poster de Firefox permet d&#039;envoyer n&#039;importe quel type de requête et donc indispensable si tu souhaites tester un service à partir de ton navigateur.

La solution &quot;http://…/albumsAndArtists/12133&quot; retombe dans les travers d&#039;un v2 dans l&#039;url. De plus, tu changes ici complètement ton contrat de service : la ressource album n&#039;existe plus et tu crées une nouvelle ressource albumsAndArtists.</description>
		<content:encoded><![CDATA[<p>Quelle classe Georges !<br />
Le User Agent est en effet un autre moyen de préciser la version du service à attaquer sans triturer l&#8217;URL de la ressource. Le champs Accept reste dans l&#8217;absolu l&#8217;attribut d&#8217;entête HTTP à privilégier. </p>
<p>Pour ce qui est de ta remarque Gabriel &#8216;intestable par le navigateur&#8217;, ce n&#8217;est pas structurant dans la manière de penser les services REST. La testabilité du navigateur n&#8217;est pas la killer feature de REST (surtout si tu ne testes que les GET). De plus avec un petit about:config tu peux tout à fait modifier ce champs ACCEPT. A noter que le plugin Poster de Firefox permet d&#8217;envoyer n&#8217;importe quel type de requête et donc indispensable si tu souhaites tester un service à partir de ton navigateur.</p>
<p>La solution &laquo;&nbsp;http://…/albumsAndArtists/12133&#8243; retombe dans les travers d&#8217;un v2 dans l&#8217;url. De plus, tu changes ici complètement ton contrat de service : la ressource album n&#8217;existe plus et tu crées une nouvelle ressource albumsAndArtists.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Georges Abidbol</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1283</link>
		<dc:creator>Georges Abidbol</dc:creator>
		<pubDate>Wed, 13 May 2009 07:58:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1283</guid>
		<description>Article intéressant. La remarque de Gabriel est pertinente également. C&#039;est pourquoi il est envisageable d&#039;identifier la représentation à envoyer au client via le User-Agent qu&#039;il envoie. Un proxy &quot;un peu fasciste&quot; :-) laissera sans doute mieux passer un User-Agent, plus sensible au changement, qu&#039;un en-tête peu commun.
ex :
GET http://.../albums/12133
User-Agent: client-v1
=&gt; Retourne la représentation v1

GET http://.../albums/12133
User-Agent: client-v2
=&gt; Retourne la représentation v2

Ainsi, c&#039;est toujours le client qui est porteur de la version de contenu avec laquelle il est compatible. La montée de version nécessite néanmoins une modification du paramètre user-agent du client http utilisé (tout comme pour la solution avec négociation de contenu cela dit).</description>
		<content:encoded><![CDATA[<p>Article intéressant. La remarque de Gabriel est pertinente également. C&#8217;est pourquoi il est envisageable d&#8217;identifier la représentation à envoyer au client via le User-Agent qu&#8217;il envoie. Un proxy &laquo;&nbsp;un peu fasciste&nbsp;&raquo; :-) laissera sans doute mieux passer un User-Agent, plus sensible au changement, qu&#8217;un en-tête peu commun.<br />
ex :<br />
GET <a href="http://.../albums/12133" rel="nofollow">http://&#8230;/albums/12133</a><br />
User-Agent: client-v1<br />
=&gt; Retourne la représentation v1</p>
<p>GET <a href="http://.../albums/12133" rel="nofollow">http://&#8230;/albums/12133</a><br />
User-Agent: client-v2<br />
=&gt; Retourne la représentation v2</p>
<p>Ainsi, c&#8217;est toujours le client qui est porteur de la version de contenu avec laquelle il est compatible. La montée de version nécessite néanmoins une modification du paramètre user-agent du client http utilisé (tout comme pour la solution avec négociation de contenu cela dit).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Par : Gabriel Guillon</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1281</link>
		<dc:creator>Gabriel Guillon</dc:creator>
		<pubDate>Tue, 12 May 2009 13:09:32 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1281</guid>
		<description>Un peu de discussion...
- la chaîne de caractère dans ton en-tête peut ne passer passer un proxy un peu fasciste,
- c&#039;est intestable automatiquement par un navigateur,
Et qui dit changement de version dit un peu de boulot côté consommateur de ton webservice.
Dans ce cas, pourquoi ne pas carrément changer le nom du WS?
Si on reprend ton exemple:
GET http://.../albums/12133
Pour la v1
Et pour la v2:
GET http://.../albumsAndArtists/12133</description>
		<content:encoded><![CDATA[<p>Un peu de discussion&#8230;<br />
- la chaîne de caractère dans ton en-tête peut ne passer passer un proxy un peu fasciste,<br />
- c&#8217;est intestable automatiquement par un navigateur,<br />
Et qui dit changement de version dit un peu de boulot côté consommateur de ton webservice.<br />
Dans ce cas, pourquoi ne pas carrément changer le nom du WS?<br />
Si on reprend ton exemple:<br />
GET <a href="http://.../albums/12133" rel="nofollow">http://&#8230;/albums/12133</a><br />
Pour la v1<br />
Et pour la v2:<br />
GET <a href="http://.../albumsAndArtists/12133" rel="nofollow">http://&#8230;/albumsAndArtists/12133</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>

