XML-RPC 웹 서비스 요청Flash Player 9 이상, Adobe AIR 1.0 이상 XML-RPC 웹 서비스는 호출 매개 변수를 URL 변수 집합이 아닌 XML 문서로 취합니다. XML-RPC 웹 서비스를 통한 트랜잭션을 수행하려면 올바르게 서식 지정된 XML 메시지를 만들어 HTTP POST 메서드를 사용하여 웹 서비스로 보냅니다. 또한 서버가 요청 데이터를 XML로 취급하도록 요청에 대한 Content-Type 헤더를 설정해야 합니다. 다음 예제에서는 REST 예제에서 보여준 것과 동일한 웹 서비스를 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를 만들고 웹 서비스 트랜잭션을 수행합니다. <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> |
|