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 {
  1. import flash.events.EventDispatcher;
  2. import flash.net.URLRequest;
  3. import flash.net.URLVariables;
  4. import flash.net.URLLoader;
  5. import flash.events.Event;
  6. import flash.net.URLRequestMethod;
  7. import funciton.events.WebServiceEvent;
  8. import com.adobe.serialization.json.JSON;
  9. import flash.xml.XMLDocument;
  10. public class WebService extends EventDispatcher {
  11. private const SOAP_SCHEMA:String = "http://schemas.xmlsoap.org/soap/envelope/";
  12. private var $__wsdl_namespace:String = "";
  13. private var loader:URLLoader = new URLLoader();
  14. private var xml:XMLDocument;
  15. public function WebService():void{
  16. loader.addEventListener(Event.COMPLETE, onCompleteHandler);
  17. }
  18. public function set wsdl_namespace(str:String):void{
  19. $__wsdl_namespace = str;
  20. }
  21. public function get wsdl_namespace():String{
  22. return $__wsdl_namespace;
  23. }
  24. public function call(request:URLRequest, method_name:String):void{
  25. var soapBody:String = '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="' + SOAP_SCHEMA + '"';
  26. soapBody += ' xmlns:n="' + wsdl_namespace + '">';
  27. soapBody += '<s:Body><n:' + method_name + '>';
  28. soapBody += escapeSoapParams(request.data);
  29. soapBody += '</n:' + method_name + '></s:Body></s:Envelope>';
  30. request.method = URLRequestMethod.POST;
  31. request.contentType = "text/xml";
  32. request.data = soapBody;
  33. loader.load(request);
  34. }
  35. private function escapeSoapParams(params:Object):String{
  36. if(typeof(params) != "object"){
  37. return params.toString().replace(/&/g, '&amp;').replace(/</g, '<').replace(/>/g, '>');
  38. }
  39. var res:String = "";
  40. for(var i:String in params) res += "<" + i + ">" + arguments.callee(params[i]) + "</" + i + ">";
  41. return res;
  42. }
  43. private function onCompleteHandler(event:Event):void{
  44. var loader:URLLoader = URLLoader(event.target);
  45. xml = new XMLDocument();
  46. xml.ignoreWhite = true;
  47. xml.parseXML(loader.data);
  48. var result:String = xml.firstChild.firstChild.firstChild.firstChild.firstChild.nodeValue;
  49. dispatchEvent(new WebServiceEvent(WebServiceEvent.COMPLETE, JSON.decode(result)));
  50. }
  51. }
  52. }

WebServiceEvent class:

    package funciton.events {
  1. import flash.events.Event;
  2. public class WebServiceEvent extends Event {
  3. public static const COMPLETE:String = "complete";
  4. public var data:Object;
  5. public function WebServiceEvent(type:String, rest:Object){
  6. super(type);
  7. data = rest;
  8. }
  9. override public function clone():Event{
  10. return new WebServiceEvent(type, data);
  11. }
  12. }
  13. }

Here is how you use it:

    import funciton.webservices.WebService;
  1. import flash.net.URLRequest;
  2. import flash.net.URLVariables;
  3. import funciton.events.WebServiceEvent;
  4. var request:URLRequest = new URLRequest("http://remoteURL/webservice.php");
  5. var ws:WebService = new WebService();
  6. ws.wsdl_namespace = "urn:myNameSpace";
  7. var vars:URLVariables = new URLVariables();
  8. vars.name = "Dude";
  9. vars.email = "email@domain.com";
  10. request.data = vars;
  11. ws.addEventListener(WebServiceEvent.COMPLETE, onLoginResult);
  12. ws.call(request, "method");
  13. function onLoginResult(event:WebServiceEvent):void{
  14. if(event.data.success){
  15. trace ("good");
  16. }else{
  17. trace ("bad");
  18. }
  19. }

Let’s hope Adobe adds support for this soon.

Hope this helps someone.