Flex中使用HttpService和WebService方式通信

     HttpService、WebService、RemoteObject是Flex中使用的三種通信方式,由於RemoteObject對服務器端環境的要求,最常用的還是前兩種通信方式。這裏僅對Webservice和HttpService這兩種方式做簡單封轉演示。

WebService:

package com.sample.Service
{
	import mx.rpc.AbstractOperation;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.soap.WebService;
	import mx.rpc.soap.Operation;
	import mx.core.mx_internal;
	
	use namespace mx_internal;
	
	public dynamic class WServiceProxy extends WebService
	{
		public function WServiceProxy(destination:String=null,rootURL:String=null)
		{
			super(destination,rootURL);
		}
		public function GetMethod(FunctionName:String,CallBack:Function=null):AbstractOperation{
			var OP:AbstractOperation=this.getOperation(FunctionName);
			if(CallBack!=null)
           		OP.addEventListener(ResultEvent.RESULT,CallBack); 
           	return OP;
           	
		}
		override public function getOperation(name:String):AbstractOperation{
			var op:Operation = new Operation(this, name);
                        op.asyncRequest = asyncRequest;
                        super.initializeOperation(op as Operation);
                        if(op.wsdlOperation==null){//WSDL加載未完成,則使用基類提供的Operate
            	            return super.getOperation(name);
                        }
                        return op;
		}

		/**調用示例
		ws=new WebService(); 
           	ws.wsdl="http://localhost/ws/webService1.asmx?wsdl";
           	ws.loadWSDL();
  
                //方法一  無參數型 聲明
                  OP=ws.getOperation("HelloWorld");
                OP.addEventListener(ResultEvent.RESULT,ret);
                OP.send("a1-","B1"); //調用   

                  //方法二 直接使用型 聲明
                 ws.Login.addEventListener(ResultEvent.RESULT,ret1);
                ws.Login("a","b");
              * */
	}
}

HttpService:

package com.sample.Service
{	
	import mx.rpc.events.ResultEvent;
	import mx.rpc.events.FaultEvent;
	public dynamic class HServiceProxy
	{
		private var comm:FwConfig = FwConfig.Instance;
		private var m_url:String;			//遠程調用地址
		
		public function HServiceProxy(destination:String,rootURL:String=null)
		{
			if(destination.length>5 && destination.substr(0,5).toLowerCase()=="http:"){
            	           m_url = destination;				//全路徑
                           }
                        else{
            	           m_url = "http://127.0.0.1"+destination;	//構造url全路徑
                           }
		}
		//獲取操作方法
		public function GetMethod(FunctionName:String="Default",
			CallBack:Function=null,ErrorCallBack:Function=null):HServiceOperate{
			var OP:HServiceOperate=new HServiceOperate(m_url,FunctionName);
			if(CallBack!=null)
           		      OP.addEventListener(ResultEvent.RESULT,CallBack);
           	        if(ErrorCallBack!=null)
           		      OP.addEventListener(FaultEvent.FAULT,ErrorCallBack);
           	        return OP;
		}
	}
}

HServiceOperate:

package com.samle.Service
{	
	import mx.collections.ArrayCollection;
	import mx.rpc.AsyncToken;
	import mx.rpc.Responder;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.http.HTTPService;
	import mx.rpc.events.AbstractEvent;
	import flash.events.EventDispatcher;
	
	/**
	 * Dispatched when an Operation invocation successfully returns.
	 * @eventType mx.rpc.events.ResultEvent.RESULT 
	 */
	[Event(name="result", type="mx.rpc.events.ResultEvent")]
	
	/**
	 * Dispatched when an Operation call fails.
	 * @eventType mx.rpc.events.FaultEvent.FAULT 
	 */
	[Event(name="fault", type="mx.rpc.events.FaultEvent")]
	public dynamic class HServiceOperate extends EventDispatcher
	{
		private var m_url:String;			//遠程調用地址
		private var m_paras:ArrayCollection;//遠程調用參數
		private var m_opName:String="Default";		//調用方法
		public function HServiceOperate(url:String,FunctionName:String=null)
		{
			m_url = url;
			if(FunctionName!=null)
			       m_opName = FunctionName;
		} 
		
		//調用
		public function call(paras:ArrayCollection=null):void
		{
			m_paras = paras;
			
			var url:String=m_url;
                        var para:String = ParametersAsQueryString;
                        if(para!=null && para.length>0)				//參數
            	         url = url+"?"+para;
			
			var httpObject:HTTPService = new HTTPService();		//實例化
                           httpObject.resultFormat = "text";//"xml" ;//"object" //"text";//返回格式
                           httpObject.url = url;
                       var responder:Responder = new Responder(onSuccess, onError);//回調方法
                          var call:AsyncToken = httpObject.send();					//發送請求
                          call.addResponder(responder);
		}
		//調用成功
		private function onSuccess(event:ResultEvent):void
		{
			dispatchRpcEvent(event);
		}
		//調用失敗
		private function onError(event:FaultEvent):void
		{
			dispatchRpcEvent(event);
		}
		///參數轉換爲QueryString
		private function get ParametersAsQueryString():String
		{
			var QString:String="";
			if(m_paras!=null && m_paras.length>0)
			{
				for(var i:int=0;ilength;i++)
				{
					QString+=m_paras[i].name+"="+m_paras[i].value+"&";
				}
				QString = QString.substr(0,QString.length-1);
			}
			if(m_opName!=null && m_opName!="Default")//添加了命令
			{
				var op:String="op="+m_opName;
				if(QString.length==0){
					QString=op;
				}else{
					QString=op+"&"+QString;
				}
			}
			return QString;
		}
		
		/*
	    * 分發事件
	    */
	    private function dispatchRpcEvent(event:AbstractEvent):void
	    {
	        if (!event.isDefaultPrevented())
	        {
	        	dispatchEvent(event);
	        }
	    }
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章