Cette documentation ne peut être employée dans le cadre
d'un cours ou d'une formation sans mon accord.
(c) 2005 - Alexandre Brillant
Coins (Combining XML & Java) : API transformant une
application en
un document XML et un document XML en une application Java à
l'aide d'un
runtime. Il sauvegarde les relations entre les objets et supporte les
JavaBeans.
http://www.jxml.com/coins/index.html
WDDX (Web Distributed Data eXchange) : C'est une langage
indépendant
en XML pour décrire des structures de données. Il est
supporté par
JavaScript 1.x, Java, ColdFusion 4.0, COM et Perl.
Exemple de données :
<!DOCTYPE wddxPacket SYSTEM "wddx.dtd"> <wddxPacket version="0.9"> <header/> <data> <var name="title"> <string>Test</string> </var> </data> </wddxPacket>
|
XMOP (XML Metadata Object Persistence) : Même principe que
WDDX
avec un langage XML SODL (Simple Object Definition Language)
http://jabr.ne.mediaone.net/documents/xmop.htm
KOALA : API pour la serialization/de-serialization
d'objet Java
en XML utilisant le langage KOML (Koala Object Markup Language).
http://www.inria.fr/koala/XML/serialization
Exemple :
public class Book implements Serializable { int id=1642; }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE koml SYSTEM "http://www.inria.fr/koala/XML/koml12.dtd">
<koml version="1.2">
<classes>
<class name="Book" uid="-5510978188925784084"> <field name="i" type="int"/> </class> </koml>
<object class="Book" id="i1"> <value type="int" name="id">1642</value> </object> </koml>
|
Les
avantages :
- Tous les avantages propre à XML : Lisibilité,
extension, validation...
- Une requête peut contenir plusieurs appels de méthode
Les
désavantages :
- La bande passante
- Le parsing et la validation réduisent la vitesse du
système
Les protocoles de communication :
De part sa nature, XML peut être utilisé pour HTTP,
SMTP, FTP, RMI,
CORBA/IIOP...
XML-RPC (XML Language Remote Procedural Call) :
Solution
exploitant HTTP (POST pour les requêtes ) et XML pour les
applications
distributées.
http://www.xmlrpc.com
- Exploitable via ASP, PHP, COM et Java.
- Supporte les types primitifs : boolean, integer, string,
float et date
- Supporte les tableaux et les structures
Exemple de requête :
<?xml version="1.0"?> <methodcall> <methodname>InsertCompanyInfo</methodName> <params> <param> <array> <data> <value><string>HexaDev</string></value> <value><int>111</int></value> <value><boolean>1</boolean></value> </data> </array> </param> </params> </methodcall>
|
Exemple de réponse :
<?xml version="1.0"?> <methodResponse> <params> <value> <array> <data> <value><double>-20.01</double></value> </data> </array> </value> </methodResponse>
|
Exemple de requête en Java :
XmlRpcClient xmlrpc = new XmlRpcClient( "http://www.localhost.com/xmlrpc/server.asp" ); Vector params = new Vector(); params.addElement( 123456 ); Integer retVal = (Integer)xmlrpc.execute( "GetCurrentBalance", params );
|
Avantages
:
- Exploite l'existant (passage des proxys et firewalls),
- Simple à utiliser
Désavantages :
- Codage des données trés verbeux (typage hors des
valeurs)
- Sécurité (POST)
Exemple :
<value> <struct> <member> <name>Product<</name> <value><string>Clock</string></value> </member> <member> <name>Cost</name> <value><i4>87</i4> </member> <member> <name>Purchase date</name> <value> <dateTime.iso8601>19990912T02:53:02</dateTime.iso8601> </value> </member> </string> </value>
|
SOAP : Simple Object Access Protocol définit
par le W3C pour
pallier aux limitations de XML-RPC. http://www.w3.org/TR/SOAP/
SOAP réduit la verbosité des données :
Exemple :
<Order xsd:xmlns="W3C-Schemas-URI"> <Product xsd:type="string">Clock</Product> <Cost xsd:type="integer">87</Cost> <PurchaseDate xsd:type="timeInstant">19990912T02:53:02</PurchaseDate> </Order>
|
Lorsque les éléments de la structure ne sont pas
nommés SOAP permet
ce style de notation :
<Order> <string>Clock</string> <integer>87</integer> <timeInstant>19990912T02:53:02</timeInstant> </Order>
|
SOAP supporte le style variant façon Visual
Basic
Exemple pour la création d'un tableau d'objets :
<ArrayOfvariant xsd:type="u:variant[2]"> <variant xsd:type="int">23</variant> <variant xsd:type="string">Test</variant> </ArrayOfvariant>
|
Il est possible de créer des tableaux à plusieurs
dimensions et de
spécifier l'indice d'une valeur
<ArrayOfArrayOfstring xsl:type="u:string[][2]"> <ArrayOfstring xsd:type="u:string[2]"> <string position="[1]">1</string> <string position="[0]">2</string> </ArrayOfstring> <ArrayOfstring xsd:type="u:string[1]"> <string>Test</string> </ArrayOfstring> </ArrayOfArrayOfstring>
|
La répétition des valeurs peut être
évitée par l'usage des "reférénces
multiples"
<Authors> <author> <name>Steve</name> <City href="#1"> </author> </Authors> <City id="1">Paris</City>
|
SOAP supporte une extension HTTP : HTTP Extension
Framework
http://www.w3.org/Protocols/HTTP/ietf-http-ext/
permettant de rendre obligatoire certains champs dans une
requête
HTTP. Toutes les commandes HTTP doivent être
préfixées par
M-. L'avantage étant de contrôler aux mieux au
travers d'un firewall
les différents appels. SOAP fonctionne aussi avec un POST
classique
Exemple :
M-PUT /a-resource HTTP/1.1 Host : www.stockquoteserver.com Content-Type : text/xml Content-Length : Man : "urn:schemas-xmlsoap-org:soap.v1", ns=01 01-SOAPMethodName: Some-Namespace-URI#GetLastTradePrice
|
Toutes requêtes ou réponses SOAP (y compris les
erreurs) utilisent
la structure suivante :
<SOAP:Envelope xmlns:SOAP="urn:schema-xmlsoap-org:soap.v1"> <SOAP:Body> Une requête ou une réponse
</SOAP:Body>
</SOAP:Envelope>
|
Une requête ou réponse sera préfixée par
un espace de nommage
'm'.
Exemple de requête :
<m:getLastTradePriceDetails xmlns:m="NameSpace-URI"> <String xsd:type="string">Param1>/String> <Float xsd:type="float">10.1>/Float> </m:getLastTradePriceDetails>
|
Remarque :
xsd:type qualifie les tags String et Float
Exemple
de réponse :
<m:getLastTradePriceDetailsResponse xmlns:m="NameSpace-URI"> <Float xsd:type="float">100000.0</Float> </m:getLastTradePriceDetailsResponse>
|
Exemple d'erreur :
<SOAP:Fault> <SOAP:faultCode>200</SOAP:faultcode> <SOAP:faultString>...</SOAP:faultstring> <SOAP:runcode>1</SOAP:runcode> </SOAP:Fault>
|
Runcode permet de connaître le niveau de
réussite de l'appel : 0,
1, 2 respectivement pour "MayBe", "No", "Yes"
SOAP est implementé par apache (http://xml.apache.org/dist/soap/
Exemple d'utilisation :
Call call = new Call (); call.setTargetObjectURI("urn:xml-soap-demo-calculator"); call.setMethodName (op); call.setEncodingStyleURI(encodingStyleURI); Vector params = new Vector ();
// Passage de deux paramètres
params.addElement (new Parameter("arg1", double.class, new Double (arg1), null)); params.addElement (new Parameter("arg2", double.class, new Double (arg2), null)); call.setParams (params); // Appel SOAP
Response resp = call.invoke ( URL );
// Réponse SOAP
if (resp.generatedFault ()) { Fault fault = resp.getFault (); System.out.println (" Fault Code = " + fault.getFaultCode ()); System.out.println (" Fault String = " + fault.getFaultString ()); return Double.NaN; } else { Parameter result = resp.getReturnValue (); System.out.println( " Réponse = " + (result.getValue ()).doubleValue () ); }
|