Nous allons aborder un peu plus en détail les protocoles SOAP et JSON-RPC.
Le protocole SOAP est un protocole d'appel de méthodes distantes basé sur XML. Le protocole défini un format de requêtes XML qui permettent d'appeler un méthode particulière et de transmettre des structures de données en argument de l'appel. De même le protocole définit une réponse SOAP qui renvoie un structure de données contenant le résultat de l'appel.
A l'initialisation du protocole, le serveur SOAP fournit une feuille WSDL qui décrit l'ensemble des méthodes appelables, leur arguments et la structure de ces derniers, ainsi que la structure des données en réponse.
Vous pouvez accéder au WSDL du webservice en appelant directement dans votre navigateur : http://demo.bibli.fr/ws/connector_out.php?source_id=2&wsdl
Le WSDL est mis en forme par une feuille XSLT afin de le rendre lisible. Vous pouvez regarder le code source du navigateur pour voir l'original.
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:pmbesSearch_simpleSearch>
<searchType xsi:type="xsd:int">0</searchType>
<searchTerm xsi:type="xsd:string">fleur</searchTerm>
<pmbUserId xsi:nil="true"/>
<OPACUserId xsi:nil="true"/>
</SOAP-ENV:pmbesSearch_simpleSearch>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Notez les lignes importantes : SOAP-ENV : le nom de la méthode appelée, suivi par les quatre arguments de la méthode.
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://sigb.net/pmb/es/apisoap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:pmbesSearch_simpleSearchResponse>
<result xsi:type="ns1:pmbesSearch_simpleSearchResponseStruct">
<searchId xsi:type="xsd:string">48a573a24c9f499e5d1e52a5a599b702</searchId>
<nbResults xsi:type="xsd:int">12</nbResults>
</result>
</SOAP-ENV:pmbesSearch_simpleSearchResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Notez la structure de données de la réponse pmbesSearch_simpleSearchResponseStruct
qui contient les données renvoyées :
<searchId xsi:type="xsd:string">48a573a24c9f499e5d1e52a5a599b702</searchId>
et
<nbResults xsi:type="xsd:int">12</nbResults>
L'intérêt du SOAP est la description très détaillée de toutes les structures de données et des appels possibles. De plus, le protocole SOAP est implémenté nativement dans la plupart des langages en toute transparence (PHP, Java, C#, VB, C++, Phyton, Ruby, Perl, ...). Enfin, par les entêtes HTTP, on peut gérer une authentification.
Il est lourd et complexe à manipuler. De plus, beaucoup d'informations de description sont transmises au détriment des données utiles. Enfin, le temps d'analyse du WSDL peut ralentir les appels.
Pour en savoir plus sur le protocole SOAP sur Wikipedia : http://fr.wikipedia.org/wiki/SOAP1
C'est un protocole d'appel qui utilise comme format des structures objet en notation Json (JavaScript Object Notation). Il est utilisé par plusieurs fournisseurs de services et notamment dans des gadgets (Yahoo, Google, ...), grace au fait qu'il soit nativement en syntaxe javascript, mais aussi dans des applications plus complètes.
En appelant le webservice à vide, on obtient le catalogue des méthodes disponibles. Appelez dans votre navigateur l'adresse : http://demo.bibli.fr/ws/connector_out.php?source_id=3, vous obtenez un fichier texte.
{
"serviceType":"JSON-RPC",
"serviceURL":"http:\/\/demo.bibli.fr\/\/ws\/connector_out.php?source_id=3",
"methods":[
{"name":"pmbesSearch_simpleSearch","parameters":[{"name":"searchType"},{"name":"searchTerm"},{"name":"pmbUserId"},{"name":"OPACUserId"}]},
{"name":"pmbesSearch_simpleSearchLocalise","parameters":[{"name":"searchType"},{"name":"searchTerm"},{"name":"pmbUserId"},{"name":"OPACUserId"},{"name":"localisation"},{"name":"section"}]},
[...]
On distingue bien dans la section methods
la liste des méthodes disponibles et leur arguments. Contrairement à SOAP, JSON-RPC n'impose pas la description de la structure des données passées aux méthodes.
L'appel d'une méthode se fait par le postage (une requête HTTP POST) d'un objet Json. Il doit contenir le nom de la méthode, les valeurs des arguments et un identifiant qui sera renvoyé dans la réponse.
{"method": "pmbesSearch_simpleSearch", "params": [0,"fleur"], "id": 1}
La réponse contient l'identifiant passé à l'appel, un indicateur d'erreur et un objet Json qui représente les données retournées.
{"result": {"searchId" : "48a573a24c9f499e5d1e52a5a599b702", "nbResults" : 12}, "error": null, "id": 1}
Il est simple, léger et compact. De plus il est facilement utilisable en Javascript (il n'existe pas d'implémentation SOAP complète en Javascript). Il est de plus en plus utilisé dans de nombreux langages, grace à sa simplicité de mise en oeuvre.
Les structures de données attendues ne sont pas décrites, et le protocole n'est pas encore complétement normalisé.
Pour en savoir plus sur le protocole JSON-RPC sur Wikipedia : http://en.wikipedia.org/wiki/JSON-RPC2
Pour en savoir plus : présentation de SOAP et liens vers les spécifications techniques dans Wikipédia (en français).
Description du protocole et liens vers des documentations techniques dans Wikipedia (en anglais).