« FMS *components* | Home | Blog skin update »

July 26, 2007

Call simple soap method

The other i needed to execute a very simple remote soap method from within flash so i created a simple class for this purpose.

The webservice returns a JSON string so i used adobe aslib for that part.

This is the code i used.

WebService class:

package funciton.webservices { import flash.events.EventDispatcher; import flash.net.URLRequest; import flash.net.URLVariables; import flash.net.URLLoader; import flash.events.Event; import flash.net.URLRequestMethod; import funciton.events.WebServiceEvent; import com.adobe.serialization.json.JSON; import flash.xml.XMLDocument; public class WebService extends EventDispatcher { private const SOAP_SCHEMA:String = "http://schemas.xmlsoap.org/soap/envelope/"; private var $__wsdl_namespace:String = ""; private var loader:URLLoader = new URLLoader(); private var xml:XMLDocument; public function WebService():void{ loader.addEventListener(Event.COMPLETE, onCompleteHandler); } public function set wsdl_namespace(str:String):void{ $__wsdl_namespace = str; } public function get wsdl_namespace():String{ return $__wsdl_namespace; } public function call(request:URLRequest, method_name:String):void{ var soapBody:String = '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="' + SOAP_SCHEMA + '"'; soapBody += ' xmlns:n="' + wsdl_namespace + '">'; soapBody += '<s:Body><n:' + method_name + '>'; soapBody += escapeSoapParams(request.data); soapBody += '</n:' + method_name + '></s:Body></s:Envelope>'; request.method = URLRequestMethod.POST; request.contentType = "text/xml"; request.data = soapBody; loader.load(request); } private function escapeSoapParams(params:Object):String{ if(typeof(params) != "object"){ return params.toString().replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); } var res:String = ""; for(var i:String in params) res += "<" + i + ">" + arguments.callee(params[i]) + "</" + i + ">"; return res; } private function onCompleteHandler(event:Event):void{ var loader:URLLoader = URLLoader(event.target); xml = new XMLDocument(); xml.ignoreWhite = true; xml.parseXML(loader.data); var result:String = xml.firstChild.firstChild.firstChild.firstChild.firstChild.nodeValue; dispatchEvent(new WebServiceEvent(WebServiceEvent.COMPLETE, JSON.decode(result))); } } }

WebServiceEvent class:

package funciton.events { import flash.events.Event; public class WebServiceEvent extends Event { public static const COMPLETE:String = "complete"; public var data:Object; public function WebServiceEvent(type:String, rest:Object){ super(type); data = rest; } override public function clone():Event{ return new WebServiceEvent(type, data); } } }

Here is how you use it:

import funciton.webservices.WebService; import flash.net.URLRequest; import flash.net.URLVariables; import funciton.events.WebServiceEvent; var request:URLRequest = new URLRequest("http://remoteURL/webservice.php"); var ws:WebService = new WebService(); ws.wsdl_namespace = "urn:myNameSpace"; var vars:URLVariables = new URLVariables(); vars.name = "Dude"; vars.email = "email@domain.com"; request.data = vars; ws.addEventListener(WebServiceEvent.COMPLETE, onLoginResult); ws.call(request, "method"); function onLoginResult(event:WebServiceEvent):void{ if(event.data.success){ trace ("good"); }else{ trace ("bad"); } }

Let's hope Adobe adds support for this soon.

Hope this helps someone.

About this Entry

This page contains a single entry by fernando published on July 26, 2007 6:39 PM.

FMS *components* was the previous entry in this blog.

Blog skin update is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.