XML-RPC-webbtjänstbegäranFlash Player 9 och senare, Adobe AIR 1.0 och senare En XML-RPC-webbtjänst tar sina anropsparametrar som ett XML-dokument istället för som en uppsättning URL-variabler. För att utföra en transaktion med en XML-RPC-webbtjänst skapar du ett korrekt formaterat XML-meddelande och skickar det till webbtjänsten med HTTP-metoden POST. Därutöver bör du ange Content-Type som begärandehuvud så att servern hanterar data för begäran som XML-data. I följande exempel visas hur du använder samma webbtjänstanrop som visades i REST-exemplet, men den här gången som en XML-RPC-tjänst: 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 ); } WebKit i AIR stöder inte E4X-syntax, och metoden som användes för att skapa XML-dokumentet i föregående exempel fungerar inte i Javascript-kod. Istället måste du skapa XML-dokumentet med hjälp av DOM-metoder eller skapa dokumentet som en sträng och använda klassen Javascript DOMParser för att konvertera strängen till XML. I följande exempel används DOM-metoder för att skapa ett XML-RPC-meddelande och en XMLHttpRequest för att utföra webbtjänsttransaktionen: <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> |
![]() |