XML-RPC Web サービス要求Flash Player 9 以降、Adobe AIR 1.0 以降 XML-RPC Web サービスでは、呼び出しパラメーターを URL 変数のセットとしてではなく XML 形式のドキュメントとして取得します。XML-RPC Web サービスでトランザクションを実行するには、適切にフォーマットされた XML メッセージを作成し、そのメッセージを HTTP POST メソッドを使用して Web サービスに送信します。また、要求に Content-Type ヘッダーを設定して、サーバーが要求データを XML 形式で扱えるようにする必要があります。 次の例は、REST の例で示した Web サービス呼び出しを実行する方法を示しています。ただし、今回は 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 ); } AIR の WebKit では E4X シンタックスをサポートしていません。したがって、前述の例で XML ドキュメントの作成に使用したメソッドは、Javascript コードでは機能しません。代わりに、DOM メソッドを使用して XML ドキュメントを作成するか、ドキュメントをストリングとして作成し、Javascript の DOMParser クラスを使用してストリングを XML に変換する必要があります。 次の例では、DOM メソッドを使用して XML-RPC メッセージを作成し、XMLHttpRequest を使用して 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> |
|