现在的位置: 首页 > 综合 > 正文

【转】Flex与.NET互操作(四):使用HttpService、URLReqeust和URLLoader加载/传输数据

2013年02月06日 ⁄ 综合 ⁄ 共 7601字 ⁄ 字号 评论关闭

在前两篇文章中分别介绍了Flex与.NET的WebService之间的数据交互通信知识,本文将介绍另外一种加载数据以及发起请求的方式。ActionScript 3.0中提供的数据加载请求类主要是HTTPService,URLLoader和URLRequest,可以通过他们协同来完成数据加载和请求。下面我么便来看看这三个类是怎么来完成数据加载工作。

     在本地IIS服务器上有如下定义的XML文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <Root>
 3   <Book>
 4     <Id>1</Id>
 5     <Name>《三国演义》</Name>
 6     <Author>罗贯中</Author>
 7     <Price>52.30</Price>
 8   </Book>
 9   <Book>
10     <Id>2</Id>
11     <Name>《西游记》</Name>
12     <Author>吴承恩</Author>
13     <Price>39.91</Price>
14   </Book>
15   <Book>
16     <Id>3</Id>
17     <Name>《红楼梦》</Name>
18     <Author>曹雪芹</Author>
19     <Price>48.20</Price>
20   </Book>
21   <Book>
22     <Id>4</Id>
23     <Name>《水浒传》</Name>
24     <Author>施耐庵</Author>
25     <Price>39.85</Price>
26   </Book>
27 </Root>

一、使用HTTPService传递和加载数据

     使用HTTPService可以实现加载数据,也可以实现参数传递,下面通过两个示例程序来讲解这两个知识点。

     首先来看看HTTPService加载数据的方式。在Flex中使用HTTPService来装载外部数据是非常简单的,他是基于HTTP协议发送POST和GET请求外部数据,然后通过指定的监听方法来处理响应。我们可以通过<mx:HTTPService>标签来完成对数据源的连接,也可以通过可编程方式来处理,两种方式没什么大的差距,实际开发中可以根据自己喜好选择。

 1 internal function onClick():void
 2 {
 3     var service:HTTPService = new
 HTTPService();
 4     service.url = "http://localhost:1146/Data/Book.xml"
;
 5     service.useProxy = false
;
 6     service.resultFormat="e4x"
;
 7 
    service.addEventListener(ResultEvent.RESULT,onResultHandler);
 8 
    service.send();
 9 
}
10 

11 internal function onResultHandler(evt:ResultEvent):void
12 {
13     var xml:XML = evt.result as
 XML;
14 
    trace(xml);
15     bookGrid.dataProvider =
 xml.Book;
16 }

 

     该示例的运行结果见文章最后,下面是这个示例的完整代码:


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 3     <mx:Script>
 4         <![CDATA[
 5 
            import mx.rpc.events.FaultEvent;
 6 
            import mx.rpc.events.ResultEvent;
 7 
            import mx.rpc.http.HTTPService;
 8 
            
 9             internal function onClick():void

10             {
11                 var service:HTTPService = new
 HTTPService();
12                 service.url = "http://localhost:1146/Data/Book.xml"
;
13                 service.useProxy = false
;
14                 service.resultFormat="e4x"
;
15 
                service.addEventListener(ResultEvent.RESULT,onResultHandler);
16 
                service.send();
17 
            }
18 
            
19             internal function onResultHandler(evt:ResultEvent):void

20             {
21                 var xml:XML = evt.result as
 XML;
22 
                trace(xml);
23                 bookGrid.dataProvider =
 xml.Book;
24 
            }
25         ]]>

26     </mx:Script>
27 
28     <mx:Panel x="49.5" y="94" width="419" height="267" layout="absolute" fontSize="12" title="使用HTTPService加载XML数据">
29         <mx:DataGrid x="10" y="10" width="377" id="bookGrid">
30             <mx:columns>
31                 <mx:DataGridColumn headerText="编号" dataField="Id"/>
32                 <mx:DataGridColumn headerText="书名" dataField="Name"/>
33                 <mx:DataGridColumn headerText="作者" dataField="Author"/>
34                 <mx:DataGridColumn headerText="价格" dataField="Price"/>
35             </mx:columns>
36         </mx:DataGrid>
37         <mx:ControlBar height="42">
38             <mx:Button label="加载数据" fontWeight="normal" click="onClick()"/>
39         </mx:ControlBar>
40     </mx:Panel>
41 </mx:Application>
42 

 

     OK,我们来看看使用HTTPService传递参数到服务端是怎么实现的。使用HTTPService传递参数可以通过两种方式实现,分别如下:

     1、直接在请求URL后面跟上参数列表,如:http://localhost/web/Test.aspx?a=1&b=2

     2、通过Flex SDK为我们提供专门用语参数传递的对象(URLVariables)来实现。

     下面以一道简单的加法运算来演示HTTPService传递参数的使用,在Flex里将需要进行加法运算的两个数传递到.NET服务端并计算其和后返回给Flex客户端,两种方式传递没有太大的区别,详细请看如下代码演示:

 1 /**
 2 
 * 通过RUL参数直接传递
 3  * */

 4 internal function onClick():void
 5 {
 6     var service:HTTPService = new
 HTTPService();
 7     var a:String =
 txtA.text;
 8     var b:String =
 txtB.text;
 9     service.url = "http://localhost:1146/OperationHandler.ashx?a="+a+"&b="+
b;
10     service.useProxy = false
;
11     service.resultFormat="e4x"
;
12 
    service.addEventListener(ResultEvent.RESULT,onResultHandler);
13 
    service.send();
14 
}
15 

16 /**
17 
 * 通过URLVariables进行参数传递
18  * */

19 internal function onClick():void
20 {
21     var service:HTTPService = new
 HTTPService();
22     service.url = "http://localhost:1146/OperationHandler.ashx"
;
23     service.useProxy = false
;
24     service.resultFormat="e4x"
;
25 
    service.addEventListener(ResultEvent.RESULT,onResultHandler);
26     var param:URLVariables = new
 URLVariables();
27     param.a =
 txtA.text;
28     param.b =
 txtB.text;
29 
    service.send();
30 }

 

      下面是完整的示例代码,可以把onClick()方法相互切换来测试两种不同的参数传递方式。

完整的示例代码

 


 1 public class OperationHandler : IHttpHandler
 2 
{
 3 

 4     public void ProcessRequest(HttpContext context)
 5 
    {
 6         context.Response.ContentType = "text/plain"
;
 7 

 8         int a = int.Parse(context.Request.QueryString["a"]);
 9         int b = int.Parse(context.Request.QueryString["b"
]);
10 

11         context.Response.Write((a + b).ToString());
12 
    }
13 

14     public bool IsReusable
15 
    {
16         get

17         {
18             return false
;
19 
        }
20 
    }
21 }

 

     上面示例的运行界面截图:

          


 

二、了解URLReqeust

     使用URLRequest 类可捕获单个 HTTP 请求中的所有信息。将URLRequest 对象传递给URLStream或URLLoader 类以及其他加载操作的load()方法以启动URL数据加载。它的使用很简单,通过构造方法构造对象就OK:

抱歉!评论已关闭.