Flex与.NET互操作 使用HttpService、URLReqeust和URLLoader加载/传输数据

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 <?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             /**
10              * 通过RUL参数直接传递
11              * */
12             internal function onClick():void
13             {
14                 var service:HTTPService = new HTTPService();
15                 var a:String = txtA.text;
16                 var b:String = txtB.text;
17                 service.url = "http://localhost:1146/OperationHandler.ashx?a="+a+"&b="+b;
18                 service.useProxy = false;
19                 service.resultFormat="e4x";
20                 service.addEventListener(ResultEvent.RESULT,onResultHandler);
21                 service.send();
22             }
23             
24             /**
25              * 通过URLVariables进行参数传递
26              * */
27 //            internal function onClick():void
28 //            {
29 //                var service:HTTPService = new HTTPService();
30 //                service.url = "http://localhost:1146/OperationHandler.ashx";
31 //                service.useProxy = false;
32 //                service.resultFormat="e4x";
33 //                service.addEventListener(ResultEvent.RESULT,onResultHandler);
34 //                var param:URLVariables = new URLVariables();
35 //     &nbs;= new URLVariables();
35 //                param.a = txtA.text;
36 //                param.b = txtB.text;
37 //                service.send();
38 //            }
39             
40             internal function onResultHandler(evt:ResultEvent):void
41             {
42                 ab.text = evt.result.toString();
43             }
44         ]]>
45     </mx:Script>
46 
47     <mx:Panel x="49.5" y="94" width="419" height="126" layout="absolute" fontSize="12" title="使用HTTPService传递参数">
48         <mx:TextInput x="33" y="10" width="91" id="txtA"/>
49         <mx:Label x="10" y="12" text="A:"/>
50         <mx:Label x="132" y="12" text="B:"/>
51         <mx:TextInput x="165" y="10" id="txtB" width="79"/>
52         <mx:Label x="252" y="12" text="A+B:"/>
53         <mx:TextInput x="293" y="10" width="95" id="ab"/>
54         <mx:ControlBar height="44">
55             <mx:Button label="计 算" fontWeight="normal" click="onClick()"/>
56         </mx:ControlBar>
57     </mx:Panel>
58 </mx:Application>
59

OperationHandler.ashx
 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:

1 var request:URLRequest = new URLRequest("http://localhost:1146/Data/Book.xml")

同样可以使用URLRequest来请求一个本地项目/应用里的文件,如下代码示例:

1 var request:URLRequest = new URLRequest("Data/Book.xml")

如上便构造好了URLRequest对象,只要将他传递给相应的对象load()方法便可实现数据加载。从某种角度可以将 URLRequest理解为建立请求的工具。要是URLRequest类对象变成可用的对象还需得通过其他类来与之配合协作,详细见后面使用 URLLoader加载数据。

URLRequest虽然功能强大,使用简单。但我们还是需要了解更多的东西,以便可以正确的应用URLRequest类和处理相应的错误。其中最引人关注的就是安全沙箱的问题,这部分我将在以后的文章中介绍,这里只需要记住两点就OK。

1、如果执行调用的 SWF 文件在只能与本地文件系统内容交互的沙箱中,而目标资源来自网络沙箱,则不允许进行数据加载。

2、如果执行调用的 SWF 文件来自网络沙箱而目标资源在本地,也不允许进行数据加载。

这里就简单介绍这些,关于URLRequest的详细资料大家可以查看官方提供的在线文档:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLRequest.html

三、使用URLLoader加载数据

URLLoader 类可以以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。下面将结合使用本地服务器上的数据(详细见文章前面的xml文件定义)的加载示例来演示URLLoader的使用方法。

那我们怎么通过URLLoader来加载它呢?很简单,使用上面介绍的URLRequest来创建请求连接,然后将URLRequest对象传递给URLLoader的load方法来实现数据加载。

1 internal function onClick():void
 2 {
 3     var request:URLRequest = new URLRequest("http://localhost:1146/Data/Book.xml");
 4     var loader:URLLoader = new URLLoader();
 5     loader.load(request);
 6     loader.addEventListener(Event.COMPLETE,onCompleteHandler);
 7 }
 8 
 9 private function onCompleteHandler(evt:Event):void
10 {
11     var xml:XML = new XML(evt.target.data);
12     bookGrid.dataProvider = xml.Book;
13 }

下面是整个mxml的代码定义:

mxml完整代码
 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             internal function onClick():void
 6             {
 7                 var request:URLRequest = new URLRequest("http://localhost:1146/Data/Book.xml");
 8                 var loader:URLLoader = new URLLoader();
 9                 loader.load(request);
10                 loader.addEventListener(Event.COMPLETE,onCompleteHandler);
11             }
12             
13             private function onCompleteHandler(evt:Event):void
14             {
15                 var xml:XML = new XML(evt.target.data);
16                 bookGrid.dataProvider = xml.Book;
17             }
18         ]]>
19     </mx:Script>
20     <mx:Panel x="49.5" y="94" width="419" height="267" layout="absolute" fontSize="12" borderColor="#E2E2E2" themeColor="#009DDF" title="使用URLLoader加在XML数据">
21         <mx:DataGrid x="10" y="10" width="377" id="bookGrid">
22             <mx:columns>
23                 <mx:DataGridColumn headerText="编号" dataField="Id"/>
24                 <mx:DataGridColumn headerText="书名" dataField="Name"/>
25                 <mx:DataGridColumn headerText="作者" dataField="Author"/>
26                 <mx:DataGridColumn headerText="价格" dataField="Price"/>
27             </mx:columns>
28         </mx:DataGrid>
29         <mx:ControlBar height="42">
30             <mx:Button label="加载数据" fontWeight="normal" click="onClick()"/>
31         </mx:ControlBar>
32     </mx:Panel>
33 </mx:Application>
34

本示例的运行结果如下图:

关于URLLoader的更多资料大家可以查看Adobe提供的在线文档:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLLoader.html

p;          param.a = txtA.text;
36 //                param.b = txtB.text;
37 //                service.send();
38 //            }
39             
40             internal function onResultHandler(evt:ResultEvent):void
41             {
42                 ab.text = evt.result.toString();
43             }
44         ]]>
45     </mx:Script>
46 
47     <mx:Panel x="49.5" y="94" width="419" height="126" layout="absolute" fontSize="12" title="使用HTTPService传递参数">
48         <mx:TextInput x="33" y="10" width="91" id="txtA"/>
49         <mx:Label x="10" y="12" text="A:"/>
50         <mx:Label x="132" y="12" text="B:"/>
51         <mx:TextInput x="165" y="10" id="txtB" width="79"/>
52         <mx:Label x="252" y="12" text="A+B:"/>
53         <mx:TextInput x="293" y="10" width="95" id="ab"/>
54         <mx:ControlBar height="44">
55             <mx:Button label="计 算" fontWeight="normal" click="onClick()"/>
56         </mx:ControlBar>
57     </mx:Panel>
58 </mx:Application>
59

(0)

相关推荐

  • ASP.NET 5已终结,迎来ASP.NET Core 1.0和.NET Core 1.0

    ASP.NET 在过去的 15 年里是个非常不错的"品牌". ASP.NET 4.6 已经支持在生产环境使用:http://get.asp.net. 但是,命名是新的,完全截取自 ASP.NET 框架 -- "ASP.NET 5",但这并不是个好主意,其中一个原因是:5 > 4.6,这样看起来 ASP.NET 5 比 ASP.NET 4.6 版本号更大,更好,甚至是可以替代 ASP.NET 4.6. 所以修改了名字,选择了一个更好的版本号. 重新引入 ASP.

  • 解决iis7.5服务器上.net 获取不到https页面的信息

    我的获取页面需要cookie,不需要的可以去掉: GET的方法: 复制代码 代码如下: /// <summary>        /// 获取URL访问的HTML内容 获取https 页面的        /// </summary>        /// <param name="Url">URL地址</param>        /// <returns>HTML内容</returns>        publ

  • ubuntu16.4下用jexus部署ASP.NET Core环境

    上篇文章介绍了下用vs发布部署到iis环境,今天说下ubuntu下部署asp.net core,不需要安装.net core sdk,自带运行时方式部署,利用jexus服务器转发请求到asp.net core. 1.部署准备环境 vmware虚拟机(其他也可以) ubuntu16.04镜像 2.发布环境 win10系统 vs2015 update3 或vs code (也可以用dotnet new -t web 命令创建项目) dotnet sdk DotNetCore.1.0.0-SDK.Pr

  • Windows Server 2012 R2 Standard搭建ASP.NET Core环境图文教程

    前言: 随着ASP.NET Core 1.0的发布,论坛里相关的文章也越来越多,正好有时间在测试环境上搭建 ASP.NET Core的发布环境,把过程中遇到的问题写给大家,以便有用到的朋友需要. 环境: Windows Server 2012 R2 Standard with Update MSDN 链接:ed2k://|file|cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso|5545705472|121EC13B53882E

  • IIS部署asp.net报404错误的解决方法

    1).所建网站->(右键)权限->"ASP.NET计算机帐户"是否已添加. 2).所建网站->(右键)属性->ASP.NET选项卡->版本是否为2.0,不是则修改为2.0; 3).IIS->WEB服务扩展中->ASP.NETV2.0是否被禁止,若为禁止状态则启动; 4).所建网站->(右键)属性->主目录->执行权限是否为:纯脚本;应用程序池是否设置: 5).所建网站->(右键)属性->ASP.NET选项卡->

  • ASP.NET Core配置教程之读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中.到了.NET Core的时候,很多我们习以为常的东西都发生了改变,其中也包括定义配置的方式.总的来说,新的配置系统显得更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源.我们可以采用内存的变量作为配置的数据源,也可以直接配置定义在持久化的文件甚至数据库中. 由

  • Asp.net与SQLserver一起打包部署安装图文教程

    一.准备必要的文件1. SQL脚本文件,生成以后安装过程中需要的表和存储过程等等:生成之后,就暂时把它命名为db.sql(注意大小写)2.LisenceFile.rtf的安装文件,因为我的系统是个人的,而且free的,所以就没有做.这个以后也是要用到的.二.在自己现有的项目里面创建部署项目:1. 在"文件"菜单上指向"添加项目",然后选择"新建项目".(图1-2)2. 在"添加新项目"对话框中,选择"项目类型&quo

  • win2003 sp2+iis 6.0上部署.net 2.0和.net 4.0网站的方法

    网站环境 IIS6.0,操作系统Windows server2003 sp2,服务器之前已经部署了.net 2.0和asp的网站,现在要部署新开发的.net 4.0网站.本来认为很简单,却遇到了很多问题,下面详细描述下过程: 1.官网下载.net framework4.0,下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=17718,或者到我们下载(http://www.jb51.net/softs/69112.html),

  • asp.net core实现文件上传功能

    本文实例为大家分享了单文件上传.多文件上传的功能,供大家参考,具体内容如下 单文件上传  上传文件在Web应用程序中是一个常见的功能.在asp.net core中上传文件并保存在服务器上,是很容易的.下面就来演示一下怎么样在 ASP.NET Core项目中进行文件上传.  首先,创建一个 asp.net core 项目,然后在Controller文件件添加一个HomeController,然后在 Views 文件夹的 Home 文件夹里添加一个 New.cshtml 视图文件.如下图: 添加一个

  • ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)

    最近要做一个项目,正逢ASP.Net Core 1.0版本的正式发布.由于现代互联网的安全要求,HTTPS加密通讯已成主流,所以就有了这个方案. 本方案启发于一个旧版的解决方案: ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1) http://www.cnblogs.com/qin-nz/p/aspnetcore-using-https-on-dnx451.html?utm_source=tuicool&utm_medium=referral  在

随机推荐