Requêtes de service Web de type XML-RPC

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Un service Web de type XML-RPC utilise en tant que paramètres d’appel un document XML au lieu d’un jeu de variables URL. Pour effectuer une transaction avec un service Web de type XML-RPC, créez un message XML correctement formaté et envoyez-le au service Web par le biais de la méthode HTTP POST. Définissez en outre l’en-tête Content-Type de la requête de sorte que le serveur traite les données de cette dernière comme des données XML.

L’exemple suivant illustre l’utilisation du même appel au service Web que l’exemple REST, mais il s’agit à présent d’un service XML-RPC :

import flash.events.Event; 
import flash.events.ErrorEvent; 
import flash.events.IOErrorEvent; 
import flash.events.SecurityErrorEvent; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.net.URLRequestMethod; 
import flash.net.URLVariables; 
public function xmlRPCRequest():void 
{ 
    //Create the XML-RPC document 
    var xmlRPC:XML = <methodCall> 
                                    <methodName></methodName> 
                                    <params> 
                                        <param> 
                                            <value> 
                                                <struct/> 
                                            </value> 
                                        </param> 
                                    </params> 
                                </methodCall>; 
     
    xmlRPC.methodName = "test.echo"; 
     
    //Add the method parameters 
    var parameters:Object = new Object(); 
    parameters.api_key = "123456ABC"; 
    parameters.message = "Able was I, ere I saw Elba."; 
     
    for( var propertyName:String in parameters ) 
    { 
        xmlRPC..struct.member[xmlRPC..struct.member.length + 1] = 
            <member> 
                <name>{propertyName}</name> 
                <value> 
                    <string>{parameters[propertyName]}</string> 
                </value> 
            </member>; 
    } 
     
    //Create the HTTP request object 
    var request:URLRequest = new URLRequest( "http://service.example.com/xml-rpc/" ); 
    request.method = URLRequestMethod.POST; 
    request.cacheResponse = false; 
    request.requestHeaders.push(new URLRequestHeader("Content-Type", "application/xml")); 
    request.data = xmlRPC; 
     
    //Initiate the request 
    requestor = new URLLoader(); 
    requestor.dataFormat = URLLoaderDataFormat.TEXT; 
    requestor.addEventListener( Event.COMPLETE, xmlRPCRequestComplete ); 
    requestor.addEventListener( IOErrorEvent.IO_ERROR, xmlRPCRequestError ); 
    requestor.addEventListener( SecurityErrorEvent.SECURITY_ERROR, xmlRPCRequestError ); 
    requestor.load( request ); 
} 
 
private function xmlRPCRequestComplete( event:Event ):void 
{ 
    trace( XML(event.target.data).toXMLString() );     
} 
 
private function xmlRPCRequestError( error:ErrorEvent ):void 
{ 
    trace( "An error occurred: " + error );     
}

Dans AIR, WebKit ne prend pas en charge la syntaxe E4X. La méthode utilisée pour créer le document XML dans l’exemple précédent ne fonctionne par conséquent pas dans un code JavaScript. Vous devez utiliser les méthodes DOM pour créer le document XML ou créer celui-ci sous forme de chaîne et la convertir au format XML à l’aide de la classe DOMParser de JavaScript.

L’exemple suivant fait appel aux méthodes DOM pour créer un message XML-RPC et à une requête XMLHttpRequest pour effectuer la transaction avec le service Web :

<html> 
<head> 
<title>XML-RPC web service request</title> 
<script type="text/javascript"> 
 
function makeRequest() 
{ 
    var requestDisplay = document.getElementById( "request" ); 
    var resultDisplay  = document.getElementById( "result" ); 
     
    var request = {}; 
    request.URL = "http://services.example.com/xmlrpc/"; 
    request.method = "test.echo"; 
    request.HTTPmethod = "POST"; 
    request.parameters = {}; 
    request.parameters.api_key = "123456ABC"; 
    request.parameters.message = "Able was I ere I saw Elba."; 
    var requestMessage = formatXMLRPC( request ); 
     
    xmlhttp = new XMLHttpRequest(); 
    xmlhttp.open( request.HTTPmethod, request.URL, true); 
    xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState == 4) { 
            resultDisplay.innerText = xmlhttp.responseText; 
        } 
    } 
    xmlhttp.send( requestMessage ); 
     
    requestDisplay.innerText = xmlToString( requestMessage.documentElement ); 
} 
 
//Formats a request as XML-RPC document 
function formatXMLRPC( request ) 
{ 
    var xmldoc = document.implementation.createDocument( "", "", null ); 
    var root = xmldoc.createElement( "methodCall" ); 
    xmldoc.appendChild( root ); 
    var methodName = xmldoc.createElement( "methodName" ); 
    var methodString = xmldoc.createTextNode( request.method ); 
    methodName.appendChild( methodString ); 
     
    root.appendChild( methodName ); 
     
        var params = xmldoc.createElement( "params" ); 
        root.appendChild( params ); 
         
        var param = xmldoc.createElement( "param" ); 
        params.appendChild( param ); 
        var value = xmldoc.createElement( "value" ); 
        param.appendChild( value ); 
        var struct = xmldoc.createElement( "struct" ); 
        value.appendChild( struct ); 
         
        for( var property in request.parameters ) 
        { 
            var member = xmldoc.createElement( "member" ); 
            struct.appendChild( member ); 
             
            var name = xmldoc.createElement( "name" ); 
            var paramName = xmldoc.createTextNode( property ); 
            name.appendChild( paramName ) 
            member.appendChild( name ); 
             
            var value = xmldoc.createElement( "value" ); 
            var type = xmldoc.createElement( "string" ); 
            value.appendChild( type ); 
            var paramValue = xmldoc.createTextNode( request.parameters[property] ); 
            type.appendChild( paramValue ) 
            member.appendChild( value ); 
        } 
    return xmldoc; 
} 
 
//Returns a string representation of an XML node 
function xmlToString( rootNode, indent ) 
{ 
    if( indent == null ) indent = ""; 
    var result = indent + "<" + rootNode.tagName + ">\n"; 
    for( var i = 0; i < rootNode.childNodes.length; i++) 
    { 
        if(rootNode.childNodes.item( i ).nodeType == Node.TEXT_NODE ) 
        { 
            result += indent + "    " + rootNode.childNodes.item( i ).textContent + "\n"; 
        } 
    } 
    if( rootNode.childElementCount > 0 ) 
    { 
        result += xmlToString( rootNode.firstElementChild, indent + "    " ); 
    } 
    if( rootNode.nextElementSibling ) 
    { 
        result += indent + "</" + rootNode.tagName + ">\n"; 
        result += xmlToString( rootNode.nextElementSibling, indent ); 
    } 
    else 
    { 
        result += indent +"</" + rootNode.tagName + ">\n"; 
    } 
    return result; 
} 
 
</script> 
</head> 
<body onload="makeRequest()"> 
<h1>Request:</h1> 
<pre id="request"></pre> 
<h1>Result:</h1> 
<pre id="result"></pre> 
</body> 
</html>