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.