flex 访问WebService的方法有很多种,使用FLEX4中的"数据/服务"功能可以自动生成访问WebService的代理类,这样可以避免把所有的数据访问都写到MXML页面上,便于重复利用,同时可以直接导入后台自定义数据类型,方便传参。
直接上代码:其中WebService接口
namespace MyNetWebService
{
/// <summary>
/// MyWebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuriTemp.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class MyWebService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public Model[] GetDetailResult(SearchParameter parmeter, Staff staff)
{
return ModelHelp.GetSaleDetailResult(parmeter, staff);
}
}
}
添加WebService服务:
连接数据/服务—>Web服务—>WSDL URL: 填写服务地址(http://localhost/XXX/MyWebService.asmx?WSDL)
使用FLEX4中的"数据/服务"功能 在services 下生成的代理类:
数据/服务 下 导入了webService的方法 和 自定义类型
自动生成访问WebService的代理类_Super_MyWebService.as
/** * This is a generated class and is not intended for modification. To customize behavior * of this service wrapper you may modify the generated sub-class of this class - MyWebService.as. */ package services.mywebservice { import com.adobe.fiber.core.model_internal; import com.adobe.fiber.services.wrapper.WebServiceWrapper; import com.adobe.serializers.utility.TypeUtility; import mx.rpc.AbstractOperation; import mx.rpc.AsyncToken; import mx.rpc.soap.mxml.Operation; import mx.rpc.soap.mxml.WebService; import valueObjects.DetailSearchParameter; import valueObjects.Employee; import valueObjects.Sale; [ExcludeClass] internal class _Super_MyWebService extends com.adobe.fiber.services.wrapper.WebServiceWrapper { // Constructor public function _Super_MyWebService() { // initialize service control _serviceControl = new mx.rpc.soap.mxml.WebService(); var operations:Object = new Object(); var operation:mx.rpc.soap.mxml.Operation; operation = new mx.rpc.soap.mxml.Operation(null, "HelloWorld"); operation.resultType = String; operations["HelloWorld"] = operation; operation = new mx.rpc.soap.mxml.Operation(null, "GetDetailResult"); operation.resultElementType = valueObjects.Sale; operations["GetDetailResult"] = operation; _serviceControl.operations = operations; try { _serviceControl.convertResultHandler = com.adobe.serializers.utility.TypeUtility.convertResultHandler; } catch (e: Error) { /* Flex 3.4 and eralier does not support the convertResultHandler functionality. */ } _serviceControl.service = "MyWebService"; _serviceControl.port = "MyWebServiceSoap"; wsdl = "http://localhost/XXX/MyWebService.asmx?WSDL"; model_internal::loadWSDLIfNecessary(); model_internal::initialize(); } /** * This method is a generated wrapper used to call the 'HelloWorld' operation. It returns an mx.rpc.AsyncToken whose * result property will be populated with the result of the operation when the server response is received. * To use this result from MXML code, define a CallResponder component and assign its token property to this method's return value. * You can then bind to CallResponder.lastResult or listen for the CallResponder.result or fault events. * * @see mx.rpc.AsyncToken * @see mx.rpc.CallResponder * * @return an mx.rpc.AsyncToken whose result property will be populated with the result of the operation when the server response is received. */ public function HelloWorld() : mx.rpc.AsyncToken { model_internal::loadWSDLIfNecessary(); var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("HelloWorld"); var _internal_token:mx.rpc.AsyncToken = _internal_operation.send() ; return _internal_token; } /** * This method is a generated wrapper used to call the 'GetDetailResult' operation. It returns an mx.rpc.AsyncToken whose * result property will be populated with the result of the operation when the server response is received. * To use this result from MXML code, define a CallResponder component and assign its token property to this method's return value. * You can then bind to CallResponder.lastResult or listen for the CallResponder.result or fault events. * * @see mx.rpc.AsyncToken * @see mx.rpc.CallResponder * * @return an mx.rpc.AsyncToken whose result property will be populated with the result of the operation when the server response is received. */ public function GetDetailResult(parmeter:valueObjects.DetailSearchParameter, loginEmp:valueObjects.Employee) : mx.rpc.AsyncToken { model_internal::loadWSDLIfNecessary(); var _internal_operation:mx.rpc.AbstractOperation = _serviceControl.getOperation("GetDetailResult"); var _internal_token:mx.rpc.AsyncToken = _internal_operation.send(parmeter,loginEmp) ; return _internal_token; } } }
自动生成访问WebService的代理类MyWebService.as
/** * This is a generated sub-class of _MyWebService.as and is intended for behavior * customization. This class is only generated when there is no file already present * at its target location. Thus custom behavior that you add here will survive regeneration * of the super-class. **/ package services.mywebservice { public class MyWebService extends _Super_MyWebService { } }
Flex 端Temp.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" layout="vertical" width="100%" height="100%" xmlns:common="common.*" xmlns:mywebservice="services.mywebservice.*" > <fx:Script> <![CDATA[ import mx.events.FlexEvent; import mx.rpc.events.ResultEvent; import mx.rpc.soap.WebService; import mx.controls.Alert; protected function btn_call_clickHandler(event:MouseEvent):void { // TODO Auto-generated method stub getresult.token=MyWebService.HelloWorld(); } protected function getresult_resultHandler(event:ResultEvent):void { // TODO Auto-generated method stub if(event.result!=null) { resultweb.text=event.result as String; } } ]]> </fx:Script> <!-- 引用css样式 --> <fx:Style source="css/style.css" /> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> <mywebservice:MyWebService id="MyWebService" showBusyCursor="true" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"/> <s:CallResponder id="getresult" result="getresult_resultHandler(event)" /> </fx:Declarations> <s:VGroup width="100%" height="100%" paddingLeft="10" paddingRight="10" paddingBottom="10" paddingTop="3"> <s:HGroup width="100%" verticalAlign="middle"> <mx:Text id="resultweb"/> <common:Cbutton id="btn_call" label="调用webService" click="btn_call_clickHandler(event)" /> </s:HGroup> <s:HGroup width="100%" verticalAlign="middle"> <s:Label verticalAlign="middle" styleName="msgTxtStyle" width="100%" id="msg_label"/> </s:HGroup> </s:VGroup> </mx:Module >
运行结果: