Cette documentation ne peut être employée dans le cadre d'un cours ou d'une formation sans mon accord.
(c) 2005 - Alexandre Brillant


I. XML <->Java

a. Coins

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

b. WDDX

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>

c. XMOP

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

d. KOALA

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>

II. XML et les applications distribuées

Les avantages :

Les désavantages :

Les protocoles de communication :

De part sa nature, XML peut être utilisé pour HTTP, SMTP, FTP, RMI, CORBA/IIOP...

a. XML-RPC

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

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 :

Désavantages :

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>

b. SOAP

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 () );
}