diff options
Diffstat (limited to 'files/fr/services_web_xml')
-rw-r--r-- | files/fr/services_web_xml/accéder_à_des_services_web_avec_mozilla_en_utilisant_un_proxy_wsdl/index.html | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/files/fr/services_web_xml/accéder_à_des_services_web_avec_mozilla_en_utilisant_un_proxy_wsdl/index.html b/files/fr/services_web_xml/accéder_à_des_services_web_avec_mozilla_en_utilisant_un_proxy_wsdl/index.html new file mode 100644 index 0000000000..47a62f39e3 --- /dev/null +++ b/files/fr/services_web_xml/accéder_à_des_services_web_avec_mozilla_en_utilisant_un_proxy_wsdl/index.html @@ -0,0 +1,227 @@ +--- +title: Accéder à des services web avec Mozilla en utilisant un proxy WSDL +slug: >- + Services_Web_XML/Accéder_à_des_services_web_avec_Mozilla_en_utilisant_un_proxy_WSDL +tags: + - Services_Web_XML +translation_of: XML_Web_Services/Accessing_Web_Services_in_Mozilla_Using_WSDL_Proxying +--- +<p>{{ Obsolete_header() }} {{ Fx_minversion_note(3, "Le support natif de WSDL et de SOAP a été enlevé de Mozilla 1.9/Firefox 3.") }}</p> + +<p>L'article sur le <a href="fr/SOAP_dans_les_navigateurs_Gecko">support de SOAP (Simple Object Access Protocol)</a> dans les navigateurs basés sur Gecko expliquait comment accéder à des services Web en utilisant l'API de bas niveau SOAP de Mozilla. SOAP est un protocole de communication entre des objets distants, basé sur XML et souvent utilisé pour communiquer avec des services Web. SOAP nécessite de construire un message et son enveloppe au format attendu par le service, et de gérer la réponse pour en extraire les informations souhaitées.</p> + +<p>Mozilla offre une interface JavaScript pour faciliter les communications via SOAP. Depuis Netscape 7.1/Mozilla 1.4, cette interface permet également l'utilisation de WSDL 1.1 (<a class="external" href="http://www.w3.org/TR/wsdl">Web Services Description Language</a>), une norme de description de services Web. Un fichier WSDL décrit les fonctionnalités d'un service et son interface, comme les fichiers d'en-tête en C ou IDL. Par ce biais, Gecko permet aux développeurs et aux développeuses d'appeler un service Web comme si c'était un objet JavaScript natif, en masquant complètement SOAP et XML. Par exemple, après avoir créé une instance "proxy" d'un service Web exposant son interface via WSDL, on peut appeler les méthodes du services comme des méthodes de l'objet JavaScript : proxy.getTranslation("en_fr", "Hello World") .</p> + +<p>Cet article traite du support de WSDL dans les navigateurs basés sur Mozilla 1.7, des problèmes d'appels inter-domaines et du nouveau modèle de sécurité proposé par Netscape pour permettre aux services Web de déterminer si un client peut accéder au service depuis n'importe quel domaine ou uniquement depuis certains.</p> + +<p>Il se base sur le service Web <a class="external" href="http://xmethods.net/ve2/ViewListing.po?key=uuid:E00104D5-2AC8-9DEA-EF4C-8BD920E1B4DD">Babelfish</a> fournis par <a class="external" href="http://www.xmethods.net/">XMethods</a>, qui a été le premier site à implémenter le nouveau modèle de sécurité des services Web de Gecko, modèle qui permet aux navigateurs basés sur Gecko d'accéder à des services d'autres domaines.</p> + +<p> </p> + +<h3 id="Cr.C3.A9er_un_proxy_WSDL" name="Cr.C3.A9er_un_proxy_WSDL">Créer un proxy WSDL</h3> + +<p>Un proxy de service Web peut être créé en JavaScript en instanciant un objet de la classe <a class="external" href="http://www.xulplanet.com/references/objref/WebServiceProxyFactory.html">WebServiceProxyFactory</a>. Le fichier WSDL est chargé via l'appel de la méthode <code>createProxyAsync</code> de la classe <code>WebServiceProxyFactory</code>.</p> + +<p>Le prototype de la méthode <code>createProxyAsync</code> est :</p> + +<pre>void createProxyAsync (String wsdlURL, String portname, String qualifier, boolean isAsync, WebServiceProxyCreationListener listener) +</pre> + +<p>Elle attend 5 paramètres :</p> + +<ol> + <li>L'emplacement du fichier WSDL. Par exemple pour Babelfish : <a class="external" href="http://www.xmethods.net/sd/2001/BabelFishService.wsdl" rel="freelink">http://www.xmethods.net/sd/2001/BabelFishService.wsdl</a> .</li> + <li>Le nom du port (en WSDL, un port correspond à une méthode du service). Ce nom fait parti de la description du service dans le fichier WSDL (cf la Figure 1).</li> + <li>Le troisième paramètre est optionnel, il n'est utilisé que lors de l'appel de la méthode via XPCOM. On l'ignorera ici.</li> + <li>Un booléen indiquant si l'appel est synchrone ou asynchrone. Netscape 7.1/Mozilla 1.4 ne permet pas de créer des proxies synchrones. Il faudra donc toujours positionner ce paramètre à <code>true</code> et fournir une procédure de rappel.</li> + <li>Le dernier paramètre est la procédure de rappel qui sera appelée quand le proxy sera complètement initialisé. Pour plus de détails, lire la section suivante.</li> +</ol> + +<p>JavaScript :</p> + +<pre class="eval">var factory = new WebServiceProxyFactory(); +factory.createProxyAsync("<a class="external" href="http://www.xmethods.net/sd/2001/BabelFishService.wsdl" rel="freelink">http://www.xmethods.net/sd/2001/BabelFishService.wsdl</a>", <span style="color: green;">"BabelFishPort"</span>, "", true, aCreationListener); +</pre> + +<p><br> + WSDL :</p> + +<pre class="eval"><?xml version="1.0"?> +<definitions name="BabelFishService" ...> + ... + <service name="BabelFishService"> + <documentation>Traduit des textes jusqu'à 5 Ko entre plusieurs langages.</documentation> + + <port <span style="color: green;">name="BabelFishPort"</span> binding="tns:BabelFishBinding"> + <soap:address location="<a class="external" href="http://services.xmethods.net:80/perl/soaplite.cgi" rel="freelink">http://services.xmethods.net:80/perl/soaplite.cgi</a>"/> + <port> + </service> +</definitions> +</pre> + +<p><strong>Figure 1.</strong> Instancier et initialiser un proxy de service Web.</p> + +<p><span class="comment">edited by sebastian gurin</span> where the argument's semantics are:</p> + +<dl> + <dt>wsdlURL</dt> + <dd>The URL of the WSDL service description. This description will be loaded and used as the basis for the service proxy.</dd> + <dt>portname</dt> + <dd>The name of the port of the service that this service proxy represents. Currently the port must represent a SOAP binding.</dd> + <dt>qualifier</dt> + <dd>The user-specified qualifier is incorporated into the names of XPCOM interfaces created for the service proxy. For C++ callers, this qualifier should be the same one used in creating the IDL used at compile time. Script callers need not specify a qualifier.</dd> + <dt>isAsync</dt> + <dd>If PR_TRUE, the method signatures of the service proxy represent an asynchronous calling convention. A callback instance must be registered with the proxy. A method call to a web service is only completed when the corresponding callback method is invoked. If PR_FALSE, the method signatures of the service proxy represent a synchronous callling convention. A method call to a web service is completed when the method call to the proxy returns.</dd> + <dt>listener</dt> + <dd>The callback instance which will be invoked when the proxy is completely initialized.</dd> +</dl> + +<p>You can also use the simpler WebServiceProxyFactory::createProxy(wsdlURL, portname, qualifier,isAsync) method for create a web service proxy. The API description of WebServiceProxyFactory can be found <a class="external" href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIWebServiceProxyFactory.html">here here</a></p> + +<h3 id="La_proc.C3.A9dure_de_rappel" name="La_proc.C3.A9dure_de_rappel">La procédure de rappel</h3> + +<p>Le dernier paramètre de <code>createProxyAsync</code> est un « listener » de création (une procédure qui « écoute » et attend des évènements). Il est appelé quand le proxy a été créé avec succès, en cas d'erreur lors de cette création et à chaque appel d'une méthode du proxy.</p> + +<p>Le listener de création est un objet de classe <a class="external" href="http://www.xulplanet.com/references/xpcomref/ifaces/nsIWebServiceProxyCreationListener.html">nsIWebServiceProxyCreationListener</a> implémentant plusieurs méthodes :</p> + +<ul> + <li>une fonction <code>onLoad</code> appelée après l'initialisation du proxy et signifiant que les méthodes du proxy sont disponibles. Le proxy lui est passé en paramètre.</li> + <li>une fonction <code>onError</code> appelée en cas d'erreur à la génération du proxy ou lors de l'appel d'une de ses méthodes. Elle reçoit alors l'erreur en paramètre.</li> +</ul> + +<p><br> + L'appel des méthodes du proxy est asynchrone. Le listener de création gère les retours (« callback ») à chaque appel de méthode. Ces retours utilisent un shéma de nommage spécifique : <code>{nom_de_la_méthode}Callback</code>. Le service Web de BabelFish ne fournit qu'une seule méthode : <code>BabelFish</code> (repérée par la balise <code>operation</code> dans le WSDL), la fonction de rappel sera donc nommée <code>BabelFishCallback</code>. La méthode <code>BabelFish</code> attend en entrée une <code>BabelFishRequest</code> composée de deux paramètres et renvoie la valeur traduite sous forme de chaîne de caractère. La figure 2 contient la partie du fichier WSDL décrivant cette méthode :</p> + +<pre><message name="BabelFishRequest"> + <part name="translationmode" type="xsd:string"/> + <part name="sourcedata" type="xsd:string"/> +</message> +<message name="BabelFishResponse"> + <part name="return" type="xsd:string"/> +</message> +<portType name="BabelFishPortType"> + <operation <span class="color1">name="BabelFish"<span>> + <input message="tns:BabelFishRequest"/> + <output message="tns:BabelFishResponse"/> + </operation> +</portType> +</pre> + +<p><strong>Figure 2.</strong> Description de la méthode dans le fichier WSDL.</p> + +<p>JavaScript :</p> + +<pre>var listener = { + // appelée une fois le proxy instancié + onLoad: function (aProxy) + { + gProxy = aProxy; + gProxy.setListener(listener); + requestTranslation(aValue); + }, + // appelée en cas d'erreur + onError: function (aError) + { + alert("Une erreur est survenue lors du traitement du fichier WSDL : " + aError); + }, + // dans Mozilla 1.4, le nom de la procédure de retour est codé en dur à {nom_de_la_méthode}Callback in 1.4beta + BabelFishCallback : function (aResult) + { + alert(aResult) + } +}; +function requestTranslation(aValue){ + if (gProxy) { + gProxy.BabelFish("en_fr", aValue); + } else { + alert("Erreur à l'initialisation du proxy"); + } +} +</pre> + +<p><strong>Figure 3.</strong> Gestion de la fonction de retour.</p> + +<h3 id="Exemple" name="Exemple">Exemple</h3> + +<p>On utilise ci-dessous utilise le code précédent pour créer un exemple entièrement fonctionnel d'appel du service Web BabelFish pour traduire une chaîne saisie par l'utilisateur.</p> + +<p>L'interface utilisateur est un formulaire avec deux listes déroulantes et un champ pour saisir le texte à traduire. La première liste déroulante (id="lang_from") permet de choisir la langue du mot à traduire, la seconde (id="lang_to") la langue dans laquelle le traduire. Un bouton appelle la fonction <code>initTranslation</code>. Celle-ci vérifie que les langues d'origine et de destination sont différentes et, si c'est le cas, appelle la fonction <code>Translate</code>. Le service Web Babel Fish attend deux arguments : une chaîne au format langueSource_langueDestination et la chaîne à traduire.</p> + +<pre>function initTranslation(){ + var fromLang = document.getElementById('lang_from').value; + var toLang = document.getElementById('lang_to').value; + + if (fromLang != toLang) + Translate(fromLang+'_'+toLang, document.getElementById('inputValue').value); + else + alert("Traduire d'une langue vers elle-même est de peu d'utilité :-) "); +} +</pre> + +<p><strong>Figure 4.</strong> Initier la traduction</p> + +<p>C'est la fonction <code>Translate</code> qui effectue l'appel du service Web. Elle teste si un objet « proxy » a déjà été créé en regardant si la variable globale <code>gProxy</code> est à <code>null</code> ou non. Si l'objet n'existe pas encore, la fonction crée un listener et l'affecte à une variable nommée <code>listener</code>. Elle appelle ensuite la fonction <code>createProxy</code> avec ce listener. Si le proxy avait déjà été créé, elle appelle la fonction <code>requestTranslation</code>.</p> + +<pre>var gProxy = null; + + +function Translate(aLangToFrom, aString){ + if (!gProxy) { + var listener = { + // gets called once the proxy has been instantiated + onLoad: function (aProxy) + { + gProxy = aProxy; + gProxy.setListener(listener); + requestTranslation(aLangToFrom, aString); + }, + // gets called if an error occurs + onError: function (aError) + { + alert("An error has occured: " + aError); + }, + // callback function is hardcoded to {methodname}Callback + BabelFishCallback : function (aResult) + { + document.getElementById("results").innerHTML = aResult; + } + }; + <span class="color1">createProxy(listener)<span>; + } else { + <span class="color2">requestTranslation(aLangToFrom, aString)<span>; + } +} + + +function <span class="color1">createProxy<span>(aCreationListener){ + try { + var factory = new WebServiceProxyFactory(); + factory.createProxyAsync("http://www.xmethods.net/sd/2001/BabelFishService.wsdl", "BabelFishPort", "", true, aCreationListener); + } catch (ex) { + alert("Failed creating the proxy: "+ ex); + } +} + + +function <span class="color2">requestTranslation<span>(aLangToFrom, aString){ + if (gProxy) { + gProxy.BabelFish(aLangToFrom, aString); + } else { + alert("Error: Proxy hasn't been set up correctly!"); + } +} +</pre> + +<p><strong>Figure 5.</strong> Création du proxy</p> + +<p>La fonction <code>createProxy</code> est exécutée à la première demande de traduction. Elle instancie un objet de classe <code>WebServiceProxyFactory</code> et crée un nouveau proxy via la méthode <code>createProxyAsync</code>, à laquelle est passé le listener de création. Une fois le proxy créé, la méthode <code>onLoad</code> du listener est appelée. Elle effecte le proxy à la variable globale <code>gProxy</code>, enregistre le listener comme listener du proxy et appelle <code>requestTranslation</code> puisque le proxy est prêt à l'emploi.</p> + +<p>La fonction <code>requestTranslation</code> appelle à son tour la méthode <code>BabelFish</code> du proxy pour effectuer l'appel du service Web. En cas de succès de l'appel, la méthode <code>BabelFishCallback</code> du listener est exécutée, elle affiche la traduction dans un <code>div</code>. En cas d'erreur de l'appel (par exemple si une erreur SOAP est retournée), la méthode <code>onError</code> du listener est appelée.</p> + +<p>On peut tester le <a class="external" href="http://devedge-temp.mozilla.org/viewsource/2003/wsdl/01/example.html">formulaire de traduction</a> (Netscape 7.1/Mozilla 1.4 ou versions supérieures).</p> + +<h3 id="Le_mod.C3.A8le_de_s.C3.A9curit.C3.A9" name="Le_mod.C3.A8le_de_s.C3.A9curit.C3.A9">Le modèle de sécurité</h3> + +<p>Un des problèmes posés par l'implémentation d'appel à des services Web dans le navigateur est la question du modèle de sécurité multi-domaine. Une limitation de JavaScript impose qu'il ne peut charger de données que depuis le même domaine que celui du serveur où le script est hébergé. Par exemple Netscape.com ne peut récupérer de données via l'appel <a href="fr/XMLHttpRequest">XMLHTTPRequest</a> que de services dans le domaine netscape.com et non de toto.com. Un autre modèle de sécurité est donc nécessaire pour permettre à un site de se connecter à un service Web distant.</p> + +<p>Netscape a proposé au W3C un modèle de sécurité dans lequel le fournisseur d'un service Web détermine si celui-ci est accessible par tout le monde, uniquement depuis certains domaines ou n'est pas accessible depuis Internet. Il faut pour cela placer un fichier XML à la racine du serveur hébergeant le service. Dans le cas de <a class="external" href="http://www.xmethods.net">XMethods</a> qui fournit Babelfish, le fichier en question est à cette adresse <a class="external" href="http://services.xmethods.net/web-scripts-access.xml" rel="freelink">http://services.xmethods.net/web-scripts-access.xml</a> et autorise l'appel du service depuis n'importe quel domaine, ce qui permet à l'exemple de cet article d'effectuer un appel sur un autre serveur. On trouvera plus d'informations sur ce modèle de sécurité à cette adresse : <a class="external" href="http://lxr.mozilla.org/mozilla/source/extensions/webservices/docs/New_Security_Model.html" rel="freelink">http://lxr.mozilla.org/mozilla/sourc...ity_Model.html</a>.</p> |