<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OCTO talks ! &#187; Versioning</title>
	<atom:link href="http://blog.octo.com/tag/versioning/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Versioning des services: principes et éléments d&#8217;architecture…</title>
		<link>http://blog.octo.com/versioning-des-services-principes-et-elements-darchitecture%e2%80%a6/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=versioning-des-services-principes-et-elements-darchitecture%25e2%2580%25a6</link>
		<comments>http://blog.octo.com/versioning-des-services-principes-et-elements-darchitecture%e2%80%a6/#comments</comments>
		<pubDate>Tue, 26 May 2009 21:17:25 +0000</pubDate>
		<dc:creator>Karim Ben Othman</dc:creator>
				<category><![CDATA[Brèves de consultants]]></category>
		<category><![CDATA[Consommateur]]></category>
		<category><![CDATA[Fournisseur]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Version]]></category>
		<category><![CDATA[Version majeure]]></category>
		<category><![CDATA[Version mineure]]></category>
		<category><![CDATA[Versioning]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[WS]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=3071</guid>
		<description><![CDATA[Dans une implémentation SOA, un service n’a de sens que s’il est invoqué par plusieurs applications ou blocs applicatifs. Par conséquent, tout changement survenant sur un service impacte l’ensemble des consommateurs de ce service. Non seulement ces changements peuvent coûter chers, en plus, l’autonomie du service est un fondement de la mise en œuvre d’une [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/versioning-de-services-rest/' rel='bookmark' title='Versioning de services REST'>Versioning de services REST</a></li>
<li><a href='http://blog.octo.com/des-principes-rest-pour-realiser-du-mashup/' rel='bookmark' title='Des principes (ou quelques idées&#8230;) REST et du Mashup'>Des principes (ou quelques idées&#8230;) REST et du Mashup</a></li>
<li><a href='http://blog.octo.com/automatiser-ses-tests-de-web-services-grace-a-soapui/' rel='bookmark' title='Automatiser ses tests de web services grâce à soapUI'>Automatiser ses tests de web services grâce à soapUI</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fversioning-des-services-principes-et-elements-darchitecture%2525e2%252580%2525a6%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Versioning%20des%20services%3A%20principes%20et%20%C3%A9l%C3%A9ments%20d%27architecture%E2%80%A6%22%20%7D);"></div>
<p>Dans une implémentation SOA, un service n’a de sens que s’il est invoqué par plusieurs applications ou blocs applicatifs. Par conséquent, tout changement survenant sur un service impacte l’ensemble des consommateurs de ce service. Non seulement ces changements peuvent coûter chers, en plus, l’autonomie du service est un fondement de la mise en œuvre d’une architecture orientée services. L’autonomie se traduit par le fait que le service peut être modifié, déployé et maintenu indépendamment des consommateurs qui l’invoquent.<span id="more-3071"></span></p>
<p>La façon la plus répondu pour faire face aux changements des services, c’est le versioning. Cela se traduit par la coexistence de plusieurs versions du même service, chacune est utilisée par un ou plusieurs consommateurs. L’introduction de la coexistence de multiples versions d’un même service permet d’avoir des cycles de vie indépendants entre fournisseurs et consommateurs de services, ce qui minimise les impacts globaux sur l’implémentation SOA. </p>
<p><img src="http://blog.octo.com/wp-content/uploads/2009/05/versioning_gene_v1.png" alt="versioning_gene_v1" title="versioning_gene_v1" width="680" height="300" class="alignnone size-full wp-image-3175" /></p>
<p>Néanmoins, gérer les versions de services est loin d’être anodin. Sans une approche bien définie, cela pourrait mettre en péril le succès de l’adoption d’une architecture orientée services.</p>
<p>Même si l’approche de versioning peut paraître simple, il est indispensable de traiter les volets suivants entre fournisseurs et consommateurs de services:<br />
<em><strong>La granularité du versioning</strong></em>: vu du client, la notion de versioning doit porter sur le service comme entité à part entière. On parle alors de versioning fonctionnel. Le versioning technique (c&#8217;est-à-dire le versioning unitaire du format du message de la requête, du format du message de la réponse, du type de transport, etc.) est à gérer en interne par le fournisseur de service d’une façon transparente par rapport aux consommateurs.</p>
<p><em><strong>L’unité de versioning</strong></em>: il est indispensable de distinguer les versions majeures (V1, V2, etc.) des versions mineures (V1.x, V2.y) dans l’implémentation d’un service. Une version mineure porte sur une optimisation de performances, correction de bugs, évolution mineure du contrat de service sous condition de compatibilité ascendante entre versions, etc. alors qu’une version majeure porte sur des modifications/évolutions fonctionnelles ou techniques impactant fortement le contrat de service (avec rupture de la compatibilité ascendante) entre fournisseur et consommateurs du service.</p>
<p><em><strong>La traçabilité d’une version</strong></em>: il est important de détailler, tracer et partager les changements survenus sur les différentes versions d’un service. Cela permettra aux consommateurs d’étudier les impacts fonctionnels et techniques sur leurs applicatifs et planifier des trajectoires de migration/évolution.</p>
<p><em><strong>Le cycle de vie d’une version</strong> </em>: Le cycle de vie doit être partagé par l’ensemble des acteurs pour que chacun puisse gérer l’évolution des versions de services que l’application qu’il gère invoque. Par exemple, la disparition d’une version de service peut profondément impacter le bon fonctionnement d’une application. En revanche, le fournisseur de service ne peut gérer indéfiniment toutes les versions. Un compromis sur le cycle de vie d’une version de service doit être trouvé entre consommateurs et fournisseur.</p>
<p><em><strong>La stratégie de déploiement et d’invocation des différentes versions d’un service </strong></em>: Trois principales stratégies de versioning se distinguent:</p>
<ol>
<em>Stratégie 1 &#8211; Le versioning est porté par l’URI d’invocation du service</em></ol>
<p>Cela implique qu’un catalogue de versions d’un même service soit géré par le fournisseur et partagé avec les consommateurs. Chaque version est considérée comme un service différent à part entière.</p>
<p><strong>Illustration</strong><br />
<img src="http://blog.octo.com/wp-content/uploads/2009/05/versiong_str1.png" alt="versiong_str1" title="versiong_str1" width="680" height="500" class="alignnone size-full wp-image-3120" /></p>
<ol>
<em>Stratégie 2 &#8211; Le versioning est porté par la requête d’invocation du service</em></ol>
<p>Cela implique qu’une unique «URI » soit exposé aux consommateurs. La version requise par le consommateur doit être mentionnée dans la requête.</p>
<p><code><em>Tip: La version doit être positionnée dans un quelconque entête technique de telle façon que le fournisseur de service n’aura pas à interpréter le contenu fonctionnel de la requête.</em></code></p>
<p>La mise en place d’un composant façade est indispensable pour cette stratégie de versioning. Il assure les 2 principales fonctions suivantes :<br />
     ► Le routage de la requête vers la version requise par le consommateur<br />
     ► L’adaptation des formats entrants/sortants par rapport aux formats requis par les différentes versions du service.</p>
<p>Pour assurer la stabilité d’un contrat d’interface, il est important à noter que le service façade doit s’adapter à tous les contrats d’interface définis. Ce qui implique la mise en œuvre d’un macro-service le plus générique possible proposant un contrat d’interface n’exposant aucune notion de versioning aux consommateurs. Ce qui rajoute une complexité supplémentaire aux fournisseurs de services qui sont menés à gérer ce type de service.</p>
<p><strong>Illustration</strong></p>
<p><img src="http://blog.octo.com/wp-content/uploads/2009/05/versioning_str2.png" alt="versioning_str2" title="versioning_str2" width="680" height="500" class="alignnone size-full wp-image-3141" /></p>
<ol>
<em>Stratégie 3 &#8211; Le versioning est géré par un composant façade du fournisseur</em></ol>
<p>Cette stratégie est semblable à la stratégie 2 en termes de stabilité de contrat d’interface. Seule différence, le client ne fournit aucune version dans sa requête d’invocation mais plutôt un identifiant qui sera exploité par le composant façade pour invoquer la bonne version du service.</p>
<p><strong>Illustration</strong><br />
<img src="http://blog.octo.com/wp-content/uploads/2009/05/versioning_str35.png" alt="versioning_str35" title="versioning_str35" width="680" height="500" class="alignnone size-full wp-image-3211" /></p>
<p>Le tableau suivant compare ces 3 stratégies en distinguant la vue « consommateur » de celle du « fournisseur » du service.<br />
<img src="http://blog.octo.com/wp-content/uploads/2009/05/tab_compa_v23.png" alt="tab_compa_v23" title="tab_compa_v23" width="700" height="500" class="alignnone size-full wp-image-3441" /></p>
<ol>
<em><br />
<h3>Quelle stratégie adopter?</h3>
<p></em></ol>
<p>Pour minimiser l&#8217;impact sur le consommateur et donner plus de flexibilité au fournisseur dans sa gestion des versions, la combinaison des stratégies 1 et 3 est le choix le plus judicieux:<br />
    ► Les versions majeures seront gérées selon la stratégie 1<br />
    ► Les versions mineures seront gérées selon la stratégie 3</p>
<p>Cela permet notamment d’éviter:<br />
    ► les macro-services complexes et ingérables<br />
    ► d’impacter les consommateurs à chaque mise en œuvre d’une version mineure.</p>
<p>La traduction architecturale générale est illustrée par le schéma ci-dessous :<br />
<img src="http://blog.octo.com/wp-content/uploads/2009/05/preco1.png" alt="preco1" title="preco1" width="680" height="700" class="alignnone size-full wp-image-3231" /></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=3071" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/versioning-de-services-rest/' rel='bookmark' title='Versioning de services REST'>Versioning de services REST</a></li>
<li><a href='http://blog.octo.com/des-principes-rest-pour-realiser-du-mashup/' rel='bookmark' title='Des principes (ou quelques idées&#8230;) REST et du Mashup'>Des principes (ou quelques idées&#8230;) REST et du Mashup</a></li>
<li><a href='http://blog.octo.com/automatiser-ses-tests-de-web-services-grace-a-soapui/' rel='bookmark' title='Automatiser ses tests de web services grâce à soapUI'>Automatiser ses tests de web services grâce à soapUI</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/versioning-des-services-principes-et-elements-darchitecture%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Versioning de services REST</title>
		<link>http://blog.octo.com/versioning-de-services-rest/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=versioning-de-services-rest</link>
		<comments>http://blog.octo.com/versioning-de-services-rest/#comments</comments>
		<pubDate>Tue, 12 May 2009 07:00:53 +0000</pubDate>
		<dc:creator>Benjamin Magnan</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Versioning]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=2838</guid>
		<description><![CDATA[Introduction Le versioning de service est un thème à part entière dans les architectures orientée service tant il structure l&#8217;évolutivité d&#8217;un service. Les architectures REST n&#8217;échappent pas à la règle. Posant les principes généraux de l&#8217;architecture, Roy Fielding n&#8217;en a pas pour autant décrit tous les méandres. Il n&#8217;appartient donc qu&#8217;à nous, développeurs et architectes, [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/versioning-des-services-principes-et-elements-darchitecture%e2%80%a6/' rel='bookmark' title='Versioning des services: principes et éléments d&#8217;architecture…'>Versioning des services: principes et éléments d&#8217;architecture…</a></li>
<li><a href='http://blog.octo.com/des-principes-rest-pour-realiser-du-mashup/' rel='bookmark' title='Des principes (ou quelques idées&#8230;) REST et du Mashup'>Des principes (ou quelques idées&#8230;) REST et du Mashup</a></li>
<li><a href='http://blog.octo.com/la-strategie-de-test-dune-architecture-rest-13-test-dintegration/' rel='bookmark' title='La stratégie de test d&#8217;une architecture REST (2/3) &#8211; Test d’intégration'>La stratégie de test d&#8217;une architecture REST (2/3) &#8211; Test d’intégration</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fversioning-de-services-rest%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Versioning%20de%20services%20REST%22%20%7D);"></div>
<h2>Introduction</h2>
<p>Le versioning de service est un thème à part entière dans les architectures orientée service tant il structure l&#8217;évolutivité d&#8217;un service. Les architectures REST n&#8217;échappent pas à la règle. Posant les principes généraux de l&#8217;architecture, Roy Fielding n&#8217;en a pas pour autant décrit tous les méandres. Il n&#8217;appartient donc qu&#8217;à nous, développeurs et architectes, de définir ce qu&#8217;est le versioning des services REST en respectant ces principes. Ce billet traitera donc la problématique de versioning des services REST.</p>
<p><span id="more-2838"></span></p>
<h2>Quand versionne-t-on ? </h2>
<p><strong><em>Les types de changement</em></strong></p>
<p>Il existe différents types de changements</p>
<ul>
<li>On peut être amené à modifier des règles métiers soit parce qu’elles évoluent, soit parce qu’elles sont « bugfixées ». </li>
<li>On peut être amené à enrichir la signature du service pour répondre à de nouveaux besoins.</li>
</ul>
<p>Souvent le premier cas n’a pas d’impact sur la signature du service et nous le laisserons volontairement en dehors du scope de cet article même si quelques problématiques de versioning se posent. </p>
<p>Dans le  second cas, les évolutions de signature (c&#8217;est-à-dire principalement des paramètres d’appels et de réponse) peuvent être soit compatible avec les versions antérieures soit incompatibles.</p>
<p><strong><em>Changement compatible</em></strong></p>
<p>Ce sont les changements qui respectent le principe de compatibilité ascendante. Ces changements n’ont aucun impact sur les clients  existants, pour peu qu’ils soient correctement implémentés. </p>
<p>C&#8217;est-à-dire qu’il respecte les pratiques suivantes :</p>
<ul>
<li>Le client ne doit pas tenir compte de l’ordre des éléments dans une représentation (XML par exemple)</li>
<li>Le client ne doit pas échouer lorsque des éléments sont rajoutés dans une représentation (XML par exemple)</li>
<li>Le client ne doit pas échouer lorsque de nouveaux codes retours sont ajoutés</li>
<li>Le client d’une représentation ne doit pas échouer lorsqu’une nouvelle représentation est ajoutée</li>
</ul>
<p> Par exemple, pour une ressource Album représentée en XML :</p>

<div class="wp_codebox"><table><tr id="p28389"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p2838code9"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Dark Side of the Moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>L’ajout d’un champ ne modifie en rien la structuration précédente du message.</p>

<div class="wp_codebox"><table><tr id="p283810"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p2838code10"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Dark Side of the Moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Roger Waters<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Les clients existants ne doivent pas être impactés.</p>
<p><em><strong>Les changements incompatibles</strong></em></p>
<p>Les changements dit incompatibles impactent directement les clients existants. Sur l’exemple précédent, si un ou plusieurs clients utilisent l’élément « artist », le fait de passer d’un artiste par album à une liste d’artistes par album rend cet élément inutilisable par ces clients.</p>

<div class="wp_codebox"><table><tr id="p283811"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p2838code11"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Dark Side of the Moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Roger Waters<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>David Gilmour <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Un client, même codé selon les règles de l’art du parsing XML, ne pourra pas absorber la modification. (nom, granularité, type, …)</p>
<p><strong><em>Quand versionner une représentation ?</em></strong></p>
<p>Les changements compatibles correspondront donc à un changement mineur, les changements incompatibles seront des changements majeurs. Ce sont ces derniers qui obligent une montée de version du service. On changera donc de version  lorsque qu’un changement de comportement du service entraîne :</p>
<ul>
<li>un changement incompatible </li>
<li>la création d’un lien vers une nouvelle ressource </li>
<li>la dépréciation d’une ressource.</li>
</ul>
<h2>Le versioning en REST</h2>
<p>Il existe plusieurs moyens de versionner. </p>
<p><strong><em>Le versioning via URL</em></strong></p>
<p>La première réponse à ce problème de versioning a été de rajouter un paramètre identifiant la version dans l’URL de la ressource.</p>
<p>Par exemple la version 1 d’une ressource album avec une représentation XML :</p>

<div class="wp_codebox"><table><tr id="p283812"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p2838code12"><pre class="xml" style="font-family:monospace;">GET http://.../v1/albums/12133
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The dark side of the moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The pink floyds<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Et  la version 2 de la même ressource album avec une représentation XML aussi :</p>

<div class="wp_codebox"><table><tr id="p283813"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p2838code13"><pre class="xml" style="font-family:monospace;">GET http://.../v2/albums/12133
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The dark side of the moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Roger Waters<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>David Guilmour<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Nick Mason<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Rick Wright<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Ce versioning est inspirée du modèle SOAP où la version est portée dans l’adressage du service. A chaque nouvelle version d’un service on définie une nouvelle URL et un nouveau schéma WSDL associé.</p>
<p>Cette approche ne nous satisfait pas sur plusieurs points :</p>
<blockquote><p><strong>Rupture avec les principes REST :</strong></p></blockquote>
<p>La plus importante est que cette approche est en rupture avec un des principes de REST : une ressource est identifiée par une URI sous entendu durable et stable dans le temps<br />
L’introduction de la version dans l’URI implique de définir une URI différente par version de la ressource maintenue par le serveur.<br />
Dans l’exemple précédent deux URI permettent d’accéder à la ressource Album.</p>
<p>De plus cette approche donne l’impression aux utilisateurs que l’album dans une version de l’API est une ressource différente du même album dans une autre version. Hors, ce qui a changé ici n’est pas la ressource mais une de ces représentations (la représentation au format XML pour être complet).</p>
<blockquote><p><strong>Exposition de paramètres techniques :</strong></p></blockquote>
<p>Cette approche rend visible directement au client une partie de la complexité de la gestion des versions de l’API.<br />
En effet, nous faisons apparaître dans l’URI un paramètre purement technique, le numéro de version, alors que l’URI représente la dénomination fonctionnelle et unique de la ressource.</p>
<p><strong><em>Best practice REST</em></strong></p>
<blockquote><p><strong>« Content negotiation »</strong></p></blockquote>
<p>Une autre approche qui s’appuie sur le mécanisme de négociation de contenu du protocole http réponds entre autre à ces limitations. Revenons en deux mots sur la négociation de contenu : ce mécanisme permet à un client d’une ressource web de spécifier quelle(s) représentation(s) il préfère obtenir.</p>
<p>Techniquement parlant cette information se trouve dans la requête http dans une entête appelée Accept header. Voici un exemple de requête avec négociation de contenu :</p>

<div class="wp_codebox"><table><tr id="p283814"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p2838code14"><pre class="xml" style="font-family:monospace;">GET http://... /albums/12133
Accept : text/xml, application/json 
…</pre></td></tr></table></div>

<p>Le serveur répondra de préférence un fragment XML, s’il le gère, une structure de données JSON dans le cas contraire.<br />
Les types définis dans l’Accept header peuvent être soit des media types standardisés soit des types personnalisés.</p>
<blockquote><p><strong>Versioning par Accept</strong></p></blockquote>
<p>Selon la philosophie REST le client spécifie dans sa requête la représentation de la ressource à laquelle il souhaite accéder. Ceci est fait au travers du mécanisme de négociation de contenu explicité ci-dessus.</p>
<p>Ce mécanisme permet donc de véhiculer les informations liées aux différentes versions de l’API. Le client spécifie dans le Accept Header quelles sont les versions d’une représentation d’une ressource qu’il souhaite avoir, par ordre de préférence.</p>
<p>La gestion des versions de service REST au travers de ce mécanisme a un prérequis : l’introduction de media types non standard.</p>
<p>Si nous reprenons l’exemple du versioning précédent les types créés seront :</p>
<ul>
<li>application/vnd.octo.music-v1+xml associé au schéma XML de la version 1 de la représentation XML de l’album</li>
<li>application/vnd.octo.music-v2+xml associé au schéma XML de la version 2 de la représentation XML de l’album</li>
</ul>
<p>Par exemple la requête pour accéder à la version 1 de la ressource album avec une représentation XML :</p>

<div class="wp_codebox"><table><tr id="p283815"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p2838code15"><pre class="xml" style="font-family:monospace;">GET http://.../albums/12133
Accept : application/vnd.octo.music-v1+xml 
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The dark side of the moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The pink floyds<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Et la requête pour accéder à la version 2 de la ressource album avec une représentation XML :</p>

<div class="wp_codebox"><table><tr id="p283816"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p2838code16"><pre class="xml" style="font-family:monospace;">GET http://.../albums/12133
Accept : application/vnd.octo.music-v2+xml 
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>The dark side of the moon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Roger Waters<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>David Guilmour<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Nick Mason<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Rick Wright<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/artists<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>		
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/album<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h2>Conclusion</h2>
<p>La principale solution apportée au problème de versioning de services REST a été d’introduire le numéro de version dans l’URI. Nous lui préférons la solution utilisant la négociation de contenu et le versioning de représentations plus que ressources.<br />
Ceci pour plusieurs raisons :</p>
<ul>
<li>Le versioning via URI enfreint un des principes fondamentaux de REST : Une URI  Une ressource</li>
<li>Dans la philosophie REST les échanges sont pilotés par le client, c’est le client qui sait quelle représentation il peut manipuler. Ceci autant pour le format des données (xml, json, html, …) que pour la version de ces données. Ces deux cas doivent être traités au travers du même mécanisme : la négociation de contenu et le champ Accept Header.
</li>
<li>La négociation de contenu permet au client de définir les versions de représentation qu’il souhaite recevoir par ordre de préférence</li>
<li>
Les principaux framework REST offrent des fonctionnalités natives de gestion de contenu coté client et serveur</li>
</ul>
<p>Dans un article futur nous pourrons décrire l’architecture technique/applicative impliquée par la gestion de versions via Accept Header. Nous pourrons ainsi répondre aux questions : Comment mettre à disposition une nouvelle version d’un service ? Comment supporter coté serveur deux versions majeures d’un service en même temps ? Comment connaître les versions utilisées par les clients du service ?</p>
<p><strong>Benoît Guillou &#038; Benjamin Magnan</strong></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2838" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/versioning-des-services-principes-et-elements-darchitecture%e2%80%a6/' rel='bookmark' title='Versioning des services: principes et éléments d&#8217;architecture…'>Versioning des services: principes et éléments d&#8217;architecture…</a></li>
<li><a href='http://blog.octo.com/des-principes-rest-pour-realiser-du-mashup/' rel='bookmark' title='Des principes (ou quelques idées&#8230;) REST et du Mashup'>Des principes (ou quelques idées&#8230;) REST et du Mashup</a></li>
<li><a href='http://blog.octo.com/la-strategie-de-test-dune-architecture-rest-13-test-dintegration/' rel='bookmark' title='La stratégie de test d&#8217;une architecture REST (2/3) &#8211; Test d’intégration'>La stratégie de test d&#8217;une architecture REST (2/3) &#8211; Test d’intégration</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/versioning-de-services-rest/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

