« 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, '&').replace(/</g, '<').replace(/>/g, '>');
}
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.