<?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>Communauté Magento francophone &#187; api</title>
	<atom:link href="http://www.wikigento.com/tag/api/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.wikigento.com</link>
	<description>Optimisation de sites E-commerce, hébergment Magento</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:33:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Magento le Web Service</title>
		<link>http://www.wikigento.com/phpzendmagento/magento-le-web-service/</link>
		<comments>http://www.wikigento.com/phpzendmagento/magento-le-web-service/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 07:00:36 +0000</pubDate>
		<dc:creator>Fabrice Beck</dc:creator>
				<category><![CDATA[Php/Zend/Magento]]></category>
		<category><![CDATA[général]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webservice]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml-rpc]]></category>

		<guid isPermaLink="false">http://www.wikigento.com/?p=430</guid>
		<description><![CDATA[Le but de cet article est de vous faire découvrir un aspect très important de Magento et pourtant  peu sexy car il s’adresse plus aux développeurs qu’aux marchands. Cette petite bête s’appelle Web Service ou API et derrière ce nom d’insecte se cache l’une des fonctionnalités les plus importantes de Magento dans le cadre de [...]]]></description>
			<content:encoded><![CDATA[<p>Le but de cet article est de vous faire découvrir un aspect très important de Magento et pourtant  peu sexy car il s’adresse plus aux développeurs qu’aux marchands.</p>
<p>Cette petite bête s’appelle Web Service ou API et derrière ce nom d’insecte se cache l’une des fonctionnalités les plus importantes de Magento dans le cadre de l’intégration d’une boutique Magento à un système d’information.</p>
<p><span id="more-430"></span></p>
<p><strong>C’est quoi un Web Service ?</strong></p>
<p>Si je devais illustrer ce qu’est un Web Service je dirais que c’est à Magento ce que le langage des signes est aux sourds. C’est un moyen de communication.</p>
<p><strong>Un moyen de communication mais pour qui ?</strong></p>
<p>Pour tous les logiciels qui auraient besoin de dialoguer avec Magento. Votre logiciel de gestion comptable, de gestion commerciale ou autre.</p>
<p><strong>Pour quoi faire ?</strong></p>
<p>A travers le Web Service un logiciel tiers pourra par exemple récupérer la liste des commandes, ajouter des produits, ajouter des catégories, …<br />
Je parlais au début d’intégration dans le système d’information, vous devez commencer à voir le potentiel de l’API, un logiciel de comptabilité pourra récupérer les commandes et mettre à jour automatiquement votre compta, votre logiciel de suivit des stocks ou de production pourra prendre en compte les volumes de produits commandé et les mettre à jour.</p>
<p><strong>Oui mais ça on le faisait déjà avant</strong></p>
<p>Probablement tant ce genre de fonctionnalité est importante, toutefois les plateformes e-commerce gratuite disposent rarement d’un Web Service natif en fait je n’en connais pas à part Magento. Donc si vous l’aviez fait auparavant vous aviez probablement du faire faire un développement spécifique (mise en place d’un Web Service, envoi de fichier, ou autre).</p>
<p>Donc</p>
<p>L’intérêt premier de ce Web Service est :</p>
<ul>
<li> Sa disponibilité assure d’une part l’homogénéité d’une plateforme Magento à l’autre (le Web Service est le même sur toutes les boutiques Magento)</li>
<li> Accélère l’intégration puisqu’il n’y plus besoin de le développer (réduisant les coûts de développement)</li>
<li> L’aspect Web Service assure que la communication sera bien assurée sans devoir personnaliser la sécurité du site puis qu’un appel standard au Web Service se fait avec le protocole http sur le port 80, il est possible si besoin de passer par du https si on veut sécuriser les données transitant sur le web.</li>
<li> Et enfin on bénéficie de la sécurité intégrée à Magento et du framework Zend.</li>
</ul>
<p><strong>Comment ça marche ?</strong></p>
<p>Sans rentrer dans les détails un Web Service communique avec un langage standardisé que n’importe quel programme est capable de générer : des flux XML.<br />
Magento supporte 2 protocoles de Web Service nativement, vous pouvez utiliser au choix SOAP ou XML-RPC, pour ceux qui ne savent pas les 2 sont du XML, mais la manière de formater les 2 n’est pas la même, l’utilisation de l’un ou l’autre dépendra principalement de l’environnement technique.<br />
Sachez cependant qu’un Web Service ne sait pas parler, il ne sait que répondre il doit donc être sollicité à chaque fois qu’on a besoin d’une information.<br />
Exemple :  Le Web Service ne pourra pas de lui-même envoyer les commandes à votre comptabilité, c’est la comptabilité qui devra solliciter le Web Service et lui demander la liste des commandes.<br />
Et la sécurité ?</p>
<p>Je n’ai pas personnellement fait de test de sécurité mais je pense que cette partie est robuste en voiçi les raisons :</p>
<p>Le Web Service n’expose que 8 méthodes publiquement et aucune de ses méthodes ne permet d&#8217;accéder aux données :</p>
<ul>
<li>startSession()</li>
<li>login(apiUser, apiKey)</li>
<li> endSession(sessionId)</li>
<li> call(sessionId, resourcePath,array arguments)</li>
<li>multiCall(sessionId, array calls,array options)</li>
<li>resources(sessionId)</li>
<li>globalFaults(sessionId)</li>
<li>resourceFaults(sessionId, resourceName)</li>
</ul>
<p>Pour accéder aux données il faut utiliser call ou multiCall, Magento vérifie alors que l’utilisateur a le droit d’utiliser la méthode appelée grâce au système ACL de Zend.<br />
A partir de là j’imagine que ces méthodes publique ont été correctement protégé et qu&#8217;en conséquence la sécurité du site n’est pas compromise.<br />
Toutefois il y a un point qui me chiffonne c’est que les requêtes http et les flux XML sont tout de même facile à intercepter pour qui le veut, or un appel à la méthode login envoie le login et mot de passe en clair, c’est pourquoi je pense qu’il faut privilégier les appels en https.</p>
<p><strong>Et les performances ?</strong></p>
<p>Soyons franc la communication passant par Web Service c’est lent et ça consomme, par exemple voici le flux XML envoyé pour l’authentification, on envoie que 3 paramètres :<br />
&lt;?xml version=&nbsp;&raquo;1.0&#8243;?&gt;<br />
&lt;methodCall&gt;<br />
&lt;methodName&gt;login&lt;/methodName&gt;<br />
&lt;params&gt;<br />
&lt;param&gt;<br />
&lt;value&gt;<br />
&lt;string&gt;Fabrice&lt;/string&gt;<br />
&lt;/value&gt;<br />
&lt;/param&gt;<br />
&lt;param&gt;<br />
&lt;value&gt;<br />
&lt;string&gt;123456&lt;/string&gt;<br />
&lt;/value&gt;<br />
&lt;/param&gt;<br />
&lt;/params&gt;<br />
&lt;/methodCall&gt;<br />
Pour 20 caractères pertinents on en envoie 10x plus à côté, et encore ici c’est de l’XML-RPC, SOAP est encore plus consommateur. De plus les temps de réponses sont longs (on compte en secondes) entre le moment ou on envoie la requête et le moment ou on reçoit la réponse. Et je ne parle pas de la consommation de ressources serveurs liée à l’exécution des requêtes en elle-même, mais à mon avis récupérer la liste des produits d’une boutique en ayant 5000+ pendant les soldes est selon moi une mauvaise idée (qui tente l’expérience ?). Ces aspects ne gâchent en rien l’utilité du Web Service mais il important d’en connaître les défauts si on veut l’exploiter de manière optimale.</p>
<p><strong>Concrètement comment je peux faire appel à l’API ?</strong></p>
<p>La première chose à connaitre est l’adresse du Web Service, elle dépend surtout du type de Web Service que vous souhaitez utiliser :<br />
SOAP : http://www.monsite.com/api/?wsdl<br />
XML-RPC : http://www.monsite.com/api/xmlrpc/</p>
<p>Ensuite cela dépend du langage que vous allez utiliser, commençons par PHP car c’est facile :</p>
<ol>
<li> $client = new SoapClient(&#8216;http://www.monsite.com/api/?wsdl&#8217;);</li>
<li> // Vous pouvez aussi utiliser</li>
<li> // http://www.monsite.com/api/soap/?wsdl</li>
<li> // Si on a besoin de s&#8217;authentifier,</li>
<li> // on récupère le jeton de session</li>
<li> $session = $client-&gt;login(&#8216;apiUser&#8217;, &#8216;apiKey&#8217;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;, &#8216;arg1&#8242;);</li>
<li> $result = $client-&gt;call($session, &#8216;module.methode&#8217;, array(&#8216;arg1&#8242;, &#8216;arg2&#8242;, &#8216;arg3&#8242;));</li>
<li> // Si on a fini on termine la session</li>
<li>$client-&gt;endSession($session);</li>
</ol>
<p><strong>Faisons un peu de .Net</strong></p>
<p>En .Net c&#8217;est un peu plus compliqué, bien que le framework .Net supporte le SOAP, il y a visiblement un problème de norme entre SOAP Magento et SOAP .Net ce qui rend cette librairie inutilisable.</p>
<p>Il va donc falloir passer par XML-RPC. Malheureusement ce type n&#8217;est pas supporté nativement par .Net, toutefois il existe une très bonne librairie gratuite créé par <a href="http://www.xml-rpc.net/">Cook Computing</a>.</p>
<p>Pour l&#8217;utiliser il va falloir créer l&#8217;interface des méthodes publique du WebService Magento, voici la mienne :</p>
<pre>using System;
using System.Text;
using CookComputing.XmlRpc;
public interface XmlRpcInterfaces : IXmlRpcProxy
{
  [XmlRpcMethod("login")]
  string login(string apiUser, string apiKey);

  [XmlRpcMethod("endSession")]
  bool endSession(string sessionID);

  [XmlRpcMethod("call")]
  XmlRpcStruct[] call(string sessionID, string resourcePath, object[] data);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data, AsyncCallback acb);

  [XmlRpcBegin]
  IAsyncResult Begincall(string sessionID, string resourcePath, object[] data, AsyncCallback acb, object state);

  [XmlRpcEnd]
  XmlRpcStruct[] Endcall(IAsyncResult iasr);
}</pre>
<p>Notez que je n&#8217;ai implémenté que 3 des 8 méthodes publiques et que j&#8217;ai implémenté la méthode call pour pouvoir faire des appels asynchrone (avec du polymorphisme en prime).</p>
<p>Pour l&#8217;utiliser c&#8217;est relativement simple, si je devais reprendre l&#8217;exemple PHP ça nous donnerai en C# :</p>
<ol>
<li> XmlRpcInterfaces proxy = XmlRpcProxyGen.Create&lt;XmlRpcInterfaces&gt;();</li>
<li> XmlRpcStruct[] result;</li>
<li> proxy.Url = @&nbsp;&raquo;http://www.monsite.com/api/xmlrpc/&nbsp;&raquo;;</li>
<li> string session = proxy.login(&laquo;&nbsp;apiUser&nbsp;&raquo;, &laquo;&nbsp;apiKey&nbsp;&raquo;);</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { });</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { &laquo;&nbsp;arg1&#8243; });</li>
<li> result = proxy.call(session, &laquo;&nbsp;module.methode&nbsp;&raquo;, new object[] { &laquo;&nbsp;arg1&#8243;, &laquo;&nbsp;arg2&#8243;, &laquo;&nbsp;arg3&#8243; });</li>
<li> proxy.endSession(session);</li>
</ol>
<p><strong>Les appels asynchrone</strong></p>
<p>Ce qu&#8217;il y a de bien avec des langages comme .Net ou Java c&#8217;est la possibilité de faire des appels Asynchrone, plutôt que d&#8217;attendre la réponse du serveur on envoie la requête et on déclenche un évènement dès que l&#8217;on réceptionne la réponse.</p>
<p>C&#8217;est possible à faire avec le WebService de Magento à 2 conditions :<br />
Tout d&#8217;abord il faut implémenter la gestion de l&#8217;appel Asynchrone (déjà fait dans mon exemple pour call) de la méthode.<br />
Ensuite il faut absolument que le serveur Apache soit configuré de manière à pouvoir garder en vie la session, sans ça vous avez toutes les chances que la session expire entre 2 requêtes ou même entre la requête et la réponse.</p>
<p>Dans la plupart des cas les appels asynchrone ne sont pas possible car Apache n&#8217;est pas configuré pour cela par défaut, un moyen de contourner cela est de faire des appels synchrone dans des threads séparés.</p>
<p><strong>Etendre le Web Service</strong></p>
<p>Utiliser le Web Service est ce dont vous avez besoin mais les traitements proposés ne vous conviennent pas ?<br />
Qu&#8217;a cela ne tienne, il est parfaitement possible de créer de nouvelles méthodes dans l&#8217;API en les implémentant dans un module Magento. Je ne ferai pas de cours sur ce point maintenant car j&#8217;ai l&#8217;intention d&#8217;écrire un article dédié aux modules ultérieurement. Sachez juste que c&#8217;est facile à faire.</p>
<p><strong>Conclusion</strong></p>
<p>Le Web Service c&#8217;est le bien.</p>
<p>Son utilisation est un vrai bonheur pour relier des applications à Magento avec les exemples que j&#8217;ai donné vous devriez pouvoir l&#8217;utiliser vous même assez facilement. Pour les marchands ou futur marchands vous connaissez désormais un des potentiels de Magento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wikigento.com/phpzendmagento/magento-le-web-service/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

