flex WebService, AsyncToken,CallResponder用法

进入主题先了解下wsdl文档提供的信息,在日常开发中,不可能手工分析wsdl的文档信息,绝大多数发完Web服务的组织都会提一份文档,描述需要发送的参数和将要收到内容,还会告诉使用者可以调用那些方法在flex开发总继承web服务很简单往往需要几行代码....但无论是那种方式都要配置发送的参数和处理要返回值的方法...这就需要我们略懂一些wsdl的文档中到底定义的那些内容,已定义的方法,可参数尤其是参数在flex定义中要用的
[color=red][b]flex WebService 使用[/b][/color]
[color=red][b]flex WebService AsyncToken使用 [/b][/color]

[b]flex WebService 使用 [/b]
[b]先过一遍wsdl提供的信息:[/b]
[img]http://dl.iteye.com/upload/attachment/500884/9cac0abe-8d5a-3d02-8011-10427906d573.jpg[/img]

按照上图提示一步一步向上看
wsdl的文档详细讲解参见:
[url]http://daoexception.iteye.com/blog/510122[/url]
[b]1.flex mxml中使用webService [/b]

[img]http://dl.iteye.com/upload/attachment/500886/32893a6f-79f1-3adf-bb59-4c271ec1ed41.jpg[/img]

[b]1.flex ActionScript中使用webService [/b]

[img]http://dl.iteye.com/upload/attachment/500889/6f656ff7-a8da-302f-8a46-0569cb2780da.jpg[/img]


[color=red][b]flex WebService AsyncToken使用[/b][/color]
Responder () 构造函数

public function Responder(result:Function, fault:Function)

使用指定的处理函数构造 responder 的实例。

参数 result:Function — 成功完成请求时应调用的函数。

fault:Function — 请求完成但出错时应调用的函数。

使用时:token.addResponder(myResponder);


<mx:Script>
<![CDATA[
import mx.rpc.AsyncToken;
import mx.rpc.Responder;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.LoadEvent;
import mx.rpc.AbstractOperation;
import mx.rpc.soap.WebService;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.rpc.soap.WebService;
private var ws:WebService;
private var responder:mx.rpc.Responder;
private var wsdl:String="http://localhost:8989/WebServiceDemo/services/WebServiceDemo?wsdl";
private function initFunc():void
{
ws=new WebService();
ws.wsdl = wsdl;
ws.requestTimeout = 300;
if (ws.canLoadWSDL()) {
ws.loadWSDL();
}
var token:AsyncToken = ws.example(txtWord.text,null);
var da:mx.rpc.Responder=new mx.rpc.Responder(Response_Result, Response_Fault);
/**
* var da:mx.rpc.Responder=new mx.rpc.Responder 当你读到这块时会认为
* new mx.rpc.Responder 是个多余的写法 简写成 var ...=new Responder...
* 可是在flah.net.Responder 也有同样的类名而且是默认导入的....只能这样声明
* 不信可以试var da:mx.rpc.Responder=new Responder(Response_Result, Response_Fault);
* 当光标放在 new Responder 提示的类型却是 flash.net.Responder....
**/
token.otherMessage = "myTestMethod Failed";//添加自定义属性
token.addResponder(da);
}
private function Response_Result(e:ResultEvent):void{
var resultStr:String;
var otherMessage:String;
ws.getOperation("example");//webservie有多个方法时时根据 getOperation()中的name参数获取对应的方法
resultStr=e.token.result.toString();// token result
txtResult.text=resultStr;
otherMessage=e.token.otherMessage;//获取自定义属性
Alert.show("Web Service AsyncToken result "+otherMessage,"success");
}

private function Response_Fault(e:FaultEvent):void
{
Alert.show(e.fault.message,"Web Service Response Error");
}
]]>
</mx:Script>



[img]http://dl.iteye.com/upload/attachment/500893/36b962db-0c1f-3c6f-80c7-0843425120d2.jpg[/img]

详细参见代码:有wsdl方便测试

[color=red]========wsdl中有targetNamespace的处理方式[/color]
对于wsdl中有 targetNamespace="http://service.ws.hmit.com">描述
java端处理使用org.apache.axis2的soap解析
调用时处理方法
String respXmlMessage = call(url,6000, "http://service.ws.hmit.com", "requestProcess", "xmlMessage", sendXml());
As端在webserver.load之前添加 处理带有命名空间的soap
ws.addSimpleHeader("header1", "http://service.ws.hmit.com", "foo","bar");

[color=red]//关于webservice xfire 返回复杂对象[/color]

xfire支持返回List,map自定义JavaBean返回数据必须可以序列化和反序列化
如果返回的数据类型是自定义的javaBean,则需要声明webservice的数据返回类型
List和map类型不需要声明
需要返回的对象要求:、
1.必须实现Serializable,公共的构造函数
2.例如返回值是User则需要在webservice接口同目录下新建一个xml文件名称为:“接口名.aegis.xml”
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="getUser">
<return-type componentType="com.object"/>
</method>
</mapping>
</mappings>
例如:
ITestService
package com.jz.services;
import java.util.List;
import com.jz.beans.User;
public interface ITestService {
public List<User> getUser(String user);
}
JavaBean:
package com.jz.beans;
import java.io.Serializable;
public class User implements Serializable{
private String name="";
public User() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


如果定义的接口中方法的返回值是自定义的JavaBean则需要声明webservice服务的返回值。例如返回值是User则需要在webservice接口同目录下新建一个xml文件名称为:“接口名.aegis.xml”,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="getUser">
<return-type componentType="com.jz.beans.User"/>
</method>
</mapping>
</mappings>
1. AsyncToken

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.AsyncToken;
import mx.events.DateChooserEvent;
private function scrollHandler(event:DateChooserEvent):void {
var month:int = event.currentTarget.displayedMonth;
var monthName:String = event.currentTarget.monthNames[month];
service.url = "xml/"+monthName+".xml";
var token:AsyncToken = service.send();
token.resultHandler = onResult;
token.faultHandler = onFault;
token.month = monthName;
}
private function onResult(event:ResultEvent):void {
resultText.text = "MonthName: "+event.token.month+"\n\n";
resultText.text += "Result: "+event.result.data.month;
}
private function onFault(event:FaultEvent):void {
resultText.text = event.fault.faultString;
}
]]>
</mx:Script>
<mx:HTTPService id="service" result="event.token.resultHandler(event)"
fault="event.token.faultHandler(event)"/>
<mx:DateChooser id="dateChooser" scroll="scrollHandler(event)"/>
<mx:TextArea id="resultText" width="300" height="200"/>
</mx:Application>

2.WebService

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
<mx:WebService id="userRequest"
wsdl="http://localhost:8500/service/service?wsdl"
load="callService()">
<mx:operation name="getRecipes" resultFormat="object"
fault="createRecipeFault(event)"
result="createRecipeHandler(event)"/>
</mx:WebService>
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
private function callService():void {
userRequest.getRecipes();
}
private function createRecipeHandler(event:ResultEvent):void {
var arrayCol:ArrayCollection = event.result as ArrayCollection;
}
private function createRecipeFault(event:FaultEvent):void {
Alert.show(" error :: "+event.message);
}
]]>
</mx:Script>
</mx:Application>


[b]flex 4 CallResponder[/b]

<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"
creationComplete="app_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
// ActionScript file
import mx.collections.ArrayCollection;
import mx.controls.Alert
import mx.events.FlexEvent;
import mx.rpc.CallResponder;
import mx.rpc.Fault;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.LoadEvent;
import mx.rpc.soap.WebService;
private const wsdl:String =
"http://localhost:8500/flex4bible/SoapService.cfc?wsdl";
[Bindable]
private var contactData:ArrayCollection;
private var service:WebService = new WebService();
private var responder:CallResponder = new CallResponder();
protected function app_creationCompleteHandler(event:FlexEvent):void
{
responder.addEventListener(ResultEvent.RESULT, resultHandler);
responder.addEventListener(FaultEvent.FAULT, faultHandler);
service.addEventListener(LoadEvent.LOAD, loadHandler);
service.loadWSDL(wsdl);
}
protected function loadHandler(event:LoadEvent):void
{
responder.token = service.getAllContacts();
}
protected function resultHandler(event:ResultEvent):void
{
contactData = event.result as ArrayCollection;
}
protected function faultHandler(event:FaultEvent):void
{
Alert.show(event.fault.faultString, event.fault.faultCode);
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout horizontalAlign="center" paddingTop="20"/>
</s:layout>
<mx:DataGrid dataProvider="{contactData}">
<mx:columns>
<mx:DataGridColumn dataField="firstname" headerText="First Name"/>
<mx:DataGridColumn dataField="lastname" headerText="Last Name"/>
</mx:columns>
</mx:DataGrid>
</s:Application>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值