<?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/</link>
	<description>Le blog d'OCTO Technology, cabinet d'architectes en systèmes d'information</description>
	<lastBuildDate>Fri, 05 Mar 2010 17:21:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<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 <img src='http://blog.octo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </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; <img src='http://blog.octo.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  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>
	<item>
		<title>Par : Bla</title>
		<link>http://blog.octo.com/versioning-de-services-rest/comment-page-1/#comment-1280</link>
		<dc:creator>Bla</dc:creator>
		<pubDate>Tue, 12 May 2009 07:37:29 +0000</pubDate>
		<guid isPermaLink="false">http://blog.octo.com/?p=2838#comment-1280</guid>
		<description>Merci pour l&#039;article, tres clair.

Y&#039;a-t-il des desavantages ou des limitations avec ce &quot;Versonning par Accept&quot; ?</description>
		<content:encoded><![CDATA[<p>Merci pour l&#8217;article, tres clair.</p>
<p>Y&#8217;a-t-il des desavantages ou des limitations avec ce &laquo;&nbsp;Versonning par Accept&nbsp;&raquo; ?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
