In this article you will learn how to call webservices hosted on asp.net applications from flex.

  First rewrite webservice class as CYMService:

package Services
{
import mx.controls.Alert;
import mx.managers.CursorManager;
import mx.rpc.AbstractOperation;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.SOAPHeader;
import mx.rpc.soap.WebService; public class CYMService extends WebService
{
private var _callBackHandler:Function; //成功时的回调函数
private var _faultHandler:Function; //失败时的回调函数
private var _args:Array; //传入的参数 //构造函数 @wsdl:WebService地址
public function CYMService(wsdl:String)
{
super(); this.wsdl = wsdl;
this.loadWSDL(); CursorManager.setBusyCursor();
} //设置成功时回调函数 @callBackHandler:回调函数
public function set callBackHandler(callBackHandler:Function):void
{
CursorManager.removeBusyCursor();
this._callBackHandler = callBackHandler;
} //获得回调函数
public function get callBackHandler():Function
{ return this._callBackHandler;
} //设置传入参数
public function set args(args:Array):void
{
this._args = args;
} //获得传入参数
public function get args():Array
{
return this._args;
} //设置失败时回调函数
public function set faultHandler(faultHandler:Function):void
{
this._faultHandler = faultHandler;
} //获得失败时回调函数
public function get faultHandler():Function
{
return this._faultHandler;
} //设置SOAP头
public function initHeader(header:SOAPHeader):void
{
this.clearHeaders();
this.addHeader(header);
} //调用WebService中的函数 @functionName:要调用的函数 @args:传入的参数
public function sendOperation(functionName:String,args:Array):void
{
//根据方法名动态调用WebService服务器的方法
var operation:AbstractOperation = this.getOperation(functionName); //为调用的方法添加监听器,回调函数由外部动态传入
operation.addEventListener(ResultEvent.RESULT,this.callBackHandler); //为调用的方法添加错误监听器,如果传入的错误处理方法为空,则调用默认的处理方法
if(this.faultHandler != null)
{
operation.addEventListener(FaultEvent.FAULT,this.faultHandler);
}
else
{
operation.addEventListener(FaultEvent.FAULT,defaultFaultHandler);
}
//为调用的方法传参数,参数类型为Array
operation.arguments = args; //执行调用的方法
operation.send();
} //没有设置失败时回调函数时的默认回调函数
private function defaultFaultHandler(event:FaultEvent):void
{
CursorManager.removeBusyCursor();
}
}
}

  Second, create class ServiceLocation to store webservice url:

package Services
{
public class ServiceLocation
{
//WebService地址
public static var webServiceURL:String="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl"; public function ServiceLocation()
{
}
}
}

  Third,call webservice's function,here is demo to call CYMService:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="" minHeight=""
initialize="application1_initializeHandler(event)"
applicationComplete="application1_applicationCompleteHandler(event)">
<fx:Script>
<![CDATA[
import Services.CYMService;
import Services.ServiceLocation; import mx.controls.Alert;
import mx.events.FlexEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent; private var m_WebService:CYMService=null;
protected function application1_initializeHandler(event:FlexEvent):void
{
// 初始WebService
m_WebService=new CYMService(ServiceLocation.webServiceURL);
m_WebService.callBackHandler = getResult;
m_WebService.faultHandler = faultHandlerFun;
} // 调用成功时,处理webservice结果
private function getResult(event:ResultEvent):void
{
if(event.result != null)
{
// doing something
}
} // 失败时处理函数
protected function faultHandlerFun(event:FaultEvent):void
{
Alert.show(event.toString());
} protected function application1_applicationCompleteHandler(event:FlexEvent):void
{
// 加载杭州的天气情况
var cityName:String = "杭州";
var arr:Array = new Array();
arr.push(cityName); // 调用webservice中的getWeatherbyCityName函数,arr为参数列
m_WebService.sendOperation("getWeatherbyCityName",arr); } ]]>
</fx:Script> </s:Application>

  Final, see the result of event.result that can be rendered on the screen and manipulated by you.

  source code is here.

  2013年11月25日 修改

  注意:Flex中WebService是异步的,所以不要指望在循环在调用WebService以获得不同的结果。

for(var i:int=; i < MAX_CHILDREN; i++)
{
// 图片
var Simgid:String = AppData.GetValue(arr[i],"事件编号");
getPicURL(Simgid);
}
//通过图片编号获得图片地址
public function getPicURL(Simgid:String):void
{
var styleName:String = "PicList"; //模型名字:图片列表
var arr:Array = new Array();
arr.push(styleName);
arr.push("Simgid='" + Simgid + "'"); //调用webservice中的GetData函数,arr为参数列
m_WebService3.sendOperation("GetData",arr);
} //调用成功时,处理webservice3结果(获得图片地址)
private function getResult3(event:ResultEvent):void
{
  ......
}

  本想通过上面代码获得每张图片地址,但调试发现图片地址均相同,且getResult3函数没有调试进去(起码没有马上调试进去),显然是异步在作怪。

  解决上面问题有两个:一是将异步以锁的形式来达到同步效果,但查阅资料不推荐使用;二是图片在一开始就全部查出放到Dictionary中,在循环中只需根据key查询value即可。

  2013年12月13日修改

  上面封装的CYMService类在工作中使用起来较麻烦,索性再封装以易用。

  封装的类还叫CYMService,回调函数以参数形式传入。

package Services
{
/**
* @author chenyuming
*/
import mx.controls.Alert;
import mx.managers.CursorManager;
import mx.rpc.AbstractOperation;
import mx.rpc.AsyncToken;
import mx.rpc.IResponder;
import mx.rpc.Responder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.SOAPHeader;
import mx.rpc.soap.WebService; public class CYMService extends WebService
{
//构造函数 @wsdl:WebService地址
public function CYMService(wsdl:String)
{
super(); this.wsdl = wsdl;
this.loadWSDL();
} //调用WebService中的函数
public function call(methodName:String,callback:Function,...args):void
{
var method:AbstractOperation = this.getOperation(methodName);
method.arguments = args; var call:AsyncToken = method.send();
call.userDefinedCallback = callback;
call.addResponder(new Responder(resultCallback, faultCallback));
} //设置成功时回调函数
public function resultCallback(event:ResultEvent):void
{
var callback:Function = event.token.userDefinedCallback as Function; if (callback != null)
{
var result:CYMServiceResult = new CYMServiceResult();
result.error = false;
result.result = event.result;
callback(result);
}
} //设置失败时回调函数
public function faultCallback(event:FaultEvent):void
{
var callback:Function = event.token.userDefinedCallback as Function;
if (callback != null)
{
var result:CYMServiceResult = new CYMServiceResult();
result.error = true;
result.errorMessage = event.fault.toString();
callback(result);
}
}
}
}

  其中CYMServiceResult定义如下:

package Services
{
/**
* @author chenyuming
*/
public class CYMServiceResult
{
public function CYMServiceResult()
{ } public var error:Boolean = false;
public var errorMessage:String = null;
public var result:Object = null;
}
}

  使用起来就变得简易了:

protected function btnGetData_clickHandler(event:MouseEvent):void
{
// 加载城市的天气情况
var cityName:String = StringUtil.trim(txtInput.text);
var arr:Array = new Array();
arr.push(cityName); var service:CYMService = new CYMService(ServiceLocation.webServiceURL);
service.call("getWeatherbyCityName",getResult,arr);
} private function getResult(event:CYMServiceResult):void
{
if(event.error) //调用错误
{
Alert.show(event.errorMessage);
}
else //调用正确
{
txtOutput.text = "";
var obj:Object= event.result;
for each(var content:String in obj)
{
txtOutput.text += content + "\n";
}
}
}

  测试代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="" minHeight=""> <fx:Script>
<![CDATA[
import Services.CYMService;
import Services.CYMServiceResult;
import Services.ServiceLocation; import mx.controls.Alert;
import mx.events.FlexEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.utils.StringUtil; private function getResult(event:CYMServiceResult):void
{
if(event.error)
{
Alert.show(event.errorMessage);
}
else
{
txtOutput.text = "";
var obj:Object= event.result;
for each(var content:String in obj)
{
txtOutput.text += content + "\n";
}
}
} protected function btnGetData_clickHandler(event:MouseEvent):void
{
// 加载城市的天气情况
var cityName:String = StringUtil.trim(txtInput.text);
var arr:Array = new Array();
arr.push(cityName); var service:CYMService = new CYMService(ServiceLocation.webServiceURL);
service.call("getWeatherbyCityName",getResult,arr);
} ]]>
</fx:Script> <s:TextArea id="txtOutput" x="" y="" width="" height="" fontFamily="宋体" fontSize=""/>
<s:TextInput id="txtInput" x="" y="" fontFamily="宋体" fontSize=""/>
<s:Button id="btnGetData" click="btnGetData_clickHandler(event)" x="" y="30.5" label="获取城市天气数据" fontFamily="宋体" fontSize=""/>
<s:Label x="" y="" text="请输出城市名称,比如:杭州" fontFamily="宋体" fontSize=""/> </s:Application>

  运行结果:

  源码下载在这

  相关文章

  (1)Flex数据交互之Remoting

   

Flex数据交互之WebService的更多相关文章

  1. Flex数据交互之Remoting

    一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...

  2. Flex数据交互之Remoting[转]

    Flex数据交互之Remoting 一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章 ...

  3. flex数据交互方式 转

    Flex数据交互方法- httpservice, webservice, RemoteObject, socket. 写在前面: 使用SOAP Web Service同Flex交互有很多好处,但是它很 ...

  4. 使用webservice实现App与服务器端数据交互

    What? webservice曾经认为是解决异构系统间整合的最佳解决方案,不依赖于第三方任何系统的支持(不需要部署RDBMS服务器),大家只需要按照官方的规范,即可完成相互之间的数据交互. Why? ...

  5. js前台与后台数据交互-前台调后台

    转自:http://blog.csdn.net/wang379275614/article/details/17033981   网站是围绕数据库来编程的,以数据库中的数据为中心,通过后台来操作这些数 ...

  6. flash数据交互

    新随笔 联系 订阅 管理 随笔 - 14  文章 - 5  评论 - 0 安卓中webview读取html,同时嵌入Flex的SWF,交互 安卓activity与html交互很简单,用javascri ...

  7. json数据交互

    springmvc 的json数据交互 - 哎幽的成长 - CSDN博客--和老师讲课相同http://blog.csdn.net/u012373815/article/details/4720818 ...

  8. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  9. SpringMVC由浅入深day02_8json数据交互

    8 json数据交互 8.1 为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据 ...

随机推荐

  1. 怎么做一个bat文件

    怎么做一个bat文件 | 浏览:639 | 更新:2014-11-25 17:02 1 2 3 4 5 6 7 分步阅读 其实做一个.BAT文件很简单,下面我就以做一个清除系统垃圾.BAT文件为例,给 ...

  2. linux信号处理时机

    信号号称所谓软中断,事实上,还是没有真正的硬件中断那样能随时改变cpu的执行流 硬件中断之所以能一发生就得到处理是因为处理器在每个指令周期的结尾都会去检查中断,这种粒度是很细的 但是信号的实现只是在进 ...

  3. 详解Android功耗分析工具Power Tutor的使用

    简介: PowerTutor 是由美国密歇根大学在谷歌的指导下开发的.它是用来展示google智能手机中主要组件或应用功耗的一种应用程序.例如,CPU,网络链接,LCD显示屏,GPS等.它允许开发者很 ...

  4. Java实现Restful框架Jersey学习

    Java与REST的邂逅(一):浅谈Jersey及JAX-RS Java与REST的邂逅(二):JAX-RS核心Annotation Java与REST的邂逅(三):浅谈Jersey MVC

  5. LNMP服务器虚拟主机管理lnmp

    安装 系统需求: 需要2 GB硬盘剩余空间 安装步骤: 1.使用putty或类似的SSH工具登陆:登陆后运行:screen -S lnmp如果提示screen命令不存在可以执行:yum install ...

  6. ps esc 问题

    最近经常发现esc键突然变得不能用了.主要是使用搜狗输入法时使用esc键取输错的字,因此还以为是搜狗的问题,后来突然想到可能是因为打开某个软件导致esc不能用,最后发现居然是ps,在网上查了后发现很多 ...

  7. opencv--图像轮廓检测

    //图像的轮廓检测上 //By MoreWindows (http://blog.csdn.net/MoreWindows) #include <opencv2/opencv.hpp> u ...

  8. UVA 572

    这是一道纯正的深度优先搜索题目. 题目要求在有多少个不同的块,而不同块的定义则是,一个块中的任意一点和l另一个块中的任意一点不会相连,而相连的定义则是 在横向.纵向和对角线上相连. #include& ...

  9. 记录几款不错的chrome主题

    虽然不是一个主题控,但是浏览器无疑是每天使用最多的工具.而在MAC底下,大多数程序边框都是银灰色的,窗口多了就难以有效区分. 所以精挑细选了几款,要求是标签要容易辨识,简洁而不花哨. 不推荐太固定的风 ...

  10. MPI运行程序(接触)

    网友遇到的问题并解决问题:mpich2在多个节点上运行并行程序时出错 我使用mpich2时遇到一下问题: 当我运行一个计算圆周率的并行程序cpi.c时,我想在指定的若干个节点上运行这个程序,比如hos ...