Flex與.NET互操作 使用HttpService、URLReqeust和URLLoader加載/傳輸數(shù)據(jù)
ActionScript 3.0中提供的數(shù)據(jù)加載請(qǐng)求類(lèi)主要是HTTPService,URLLoader和URLRequest,可以通過(guò)他們協(xié)同來(lái)完成數(shù)據(jù)加載和請(qǐng)求。下面我么便來(lái)看看這三個(gè)類(lèi)是怎么來(lái)完成數(shù)據(jù)加載工作。
在本地IIS服務(wù)器上有如下定義的XML文件:
2 <Root>
3 <Book>
4 <Id>1</Id>
5 <Name>《三國(guó)演義》</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>《紅樓夢(mèng)》</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傳遞和加載數(shù)據(jù)
使用HTTPService可以實(shí)現(xiàn)加載數(shù)據(jù),也可以實(shí)現(xiàn)參數(shù)傳遞,下面通過(guò)兩個(gè)示例程序來(lái)講解這兩個(gè)知識(shí)點(diǎn)。
首先來(lái)看看HTTPService加載數(shù)據(jù)的方式。在Flex中使用HTTPService來(lái)裝載外部數(shù)據(jù)是非常簡(jiǎn)單的,他是基于 HTTP協(xié)議發(fā)送POST和GET請(qǐng)求外部數(shù)據(jù),然后通過(guò)指定的監(jiān)聽(tīng)方法來(lái)處理響應(yīng)。我們可以通過(guò)<mx:HTTPService>標(biāo)簽來(lái)完成對(duì)數(shù)據(jù)源的連接,也可以通過(guò)可編程方式來(lái)處理,兩種方式?jīng)]什么大的差距,實(shí)際開(kāi)發(fā)中可以根據(jù)自己喜好選擇。
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 }
該示例的運(yùn)行結(jié)果見(jiàn)文章最后,下面是這個(gè)示例的完整代碼:


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數(shù)據(jù)">
29 <mx:DataGrid x="10" y="10" width="377" id="bookGrid">
30 <mx:columns>
31 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
32 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
33 <mx:DataGridColumn headerText="作者" dataField="Author"/>
34 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
35 </mx:columns>
36 </mx:DataGrid>
37 <mx:ControlBar height="42">
38 <mx:Button label="加載數(shù)據(jù)" fontWeight="normal" click="onClick()"/>
39 </mx:ControlBar>
40 </mx:Panel>
41 </mx:Application>
42
OK,我們來(lái)看看使用HTTPService傳遞參數(shù)到服務(wù)端是怎么實(shí)現(xiàn)的。使用HTTPService傳遞參數(shù)可以通過(guò)兩種方式實(shí)現(xiàn),分別如下:
1、直接在請(qǐng)求URL后面跟上參數(shù)列表,如:http://localhost/web/Test.aspx?a=1&b=2。
2、通過(guò)Flex SDK為我們提供專(zhuān)門(mén)用語(yǔ)參數(shù)傳遞的對(duì)象(URLVariables)來(lái)實(shí)現(xiàn)。
下面以一道簡(jiǎn)單的加法運(yùn)算來(lái)演示HTTPService傳遞參數(shù)的使用,在Flex里將需要進(jìn)行加法運(yùn)算的兩個(gè)數(shù)傳遞到.NET服務(wù)端并計(jì)算其和后返回給Flex客戶(hù)端,兩種方式傳遞沒(méi)有太大的區(qū)別,詳細(xì)請(qǐng)看如下代碼演示:
2 * 通過(guò)RUL參數(shù)直接傳遞
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 * 通過(guò)URLVariables進(jìn)行參數(shù)傳遞
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()方法相互切換來(lái)測(cè)試兩種不同的參數(shù)傳遞方式。


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 * 通過(guò)RUL參數(shù)直接傳遞
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 * 通過(guò)URLVariables進(jìn)行參數(shù)傳遞
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傳遞參數(shù)">
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="計(jì) 算" fontWeight="normal" click="onClick()"/>
56 </mx:ControlBar>
57 </mx:Panel>
58 </mx:Application>
59


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 }
上面示例的運(yùn)行界面截圖:
二、了解URLReqeust
使用URLRequest 類(lèi)可捕獲單個(gè) HTTP 請(qǐng)求中的所有信息。將URLRequest 對(duì)象傳遞給URLStream或URLLoader 類(lèi)以及其他加載操作的load()
方法以啟動(dòng)URL數(shù)據(jù)加載。它的使用很簡(jiǎn)單,通過(guò)構(gòu)造方法構(gòu)造對(duì)象就OK:
同樣可以使用URLRequest來(lái)請(qǐng)求一個(gè)本地項(xiàng)目/應(yīng)用里的文件,如下代碼示例:
如上便構(gòu)造好了URLRequest對(duì)象,只要將他傳遞給相應(yīng)的對(duì)象load()方法便可實(shí)現(xiàn)數(shù)據(jù)加載。從某種角度可以將 URLRequest理解為建立請(qǐng)求的工具。要是URLRequest類(lèi)對(duì)象變成可用的對(duì)象還需得通過(guò)其他類(lèi)來(lái)與之配合協(xié)作,詳細(xì)見(jiàn)后面使用 URLLoader加載數(shù)據(jù)。
URLRequest雖然功能強(qiáng)大,使用簡(jiǎn)單。但我們還是需要了解更多的東西,以便可以正確的應(yīng)用URLRequest類(lèi)和處理相應(yīng)的錯(cuò)誤。其中最引人關(guān)注的就是安全沙箱的問(wèn)題,這部分我將在以后的文章中介紹,這里只需要記住兩點(diǎn)就OK。
1、如果執(zhí)行調(diào)用的 SWF 文件在只能與本地文件系統(tǒng)內(nèi)容交互的沙箱中,而目標(biāo)資源來(lái)自網(wǎng)絡(luò)沙箱,則不允許進(jìn)行數(shù)據(jù)加載。
2、如果執(zhí)行調(diào)用的 SWF 文件來(lái)自網(wǎng)絡(luò)沙箱而目標(biāo)資源在本地,也不允許進(jìn)行數(shù)據(jù)加載。
這里就簡(jiǎn)單介紹這些,關(guān)于URLRequest的詳細(xì)資料大家可以查看官方提供的在線(xiàn)文檔:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLRequest.html
三、使用URLLoader加載數(shù)據(jù)
URLLoader 類(lèi)可以以文本、二進(jìn)制數(shù)據(jù)或 URL 編碼變量的形式從 URL 下載數(shù)據(jù)。下面將結(jié)合使用本地服務(wù)器上的數(shù)據(jù)(詳細(xì)見(jiàn)文章前面的xml文件定義)的加載示例來(lái)演示URLLoader的使用方法。
那我們?cè)趺赐ㄟ^(guò)URLLoader來(lái)加載它呢?很簡(jiǎn)單,使用上面介紹的URLRequest來(lái)創(chuàng)建請(qǐng)求連接,然后將URLRequest對(duì)象傳遞給URLLoader的load方法來(lái)實(shí)現(xiàn)數(shù)據(jù)加載。
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 }
下面是整個(gè)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數(shù)據(jù)">
21 <mx:DataGrid x="10" y="10" width="377" id="bookGrid">
22 <mx:columns>
23 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
24 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
25 <mx:DataGridColumn headerText="作者" dataField="Author"/>
26 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
27 </mx:columns>
28 </mx:DataGrid>
29 <mx:ControlBar height="42">
30 <mx:Button label="加載數(shù)據(jù)" fontWeight="normal" click="onClick()"/>
31 </mx:ControlBar>
32 </mx:Panel>
33 </mx:Application>
34
本示例的運(yùn)行結(jié)果如下圖:
關(guān)于URLLoader的更多資料大家可以查看Adobe提供的在線(xiàn)文檔: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傳遞參數(shù)">
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="計(jì) 算" fontWeight="normal" click="onClick()"/>
56 </mx:ControlBar>
57 </mx:Panel>
58 </mx:Application>
59


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 }
上面示例的運(yùn)行界面截圖:
二、了解URLReqeust
使用URLRequest 類(lèi)可捕獲單個(gè) HTTP 請(qǐng)求中的所有信息。將URLRequest 對(duì)象傳遞給URLStream或URLLoader 類(lèi)以及其他加載操作的load()
方法以啟動(dòng)URL數(shù)據(jù)加載。它的使用很簡(jiǎn)單,通過(guò)構(gòu)造方法構(gòu)造對(duì)象就OK:
同樣可以使用URLRequest來(lái)請(qǐng)求一個(gè)本地項(xiàng)目/應(yīng)用里的文件,如下代碼示例:
如上便構(gòu)造好了URLRequest對(duì)象,只要將他傳遞給相應(yīng)的對(duì)象load()方法便可實(shí)現(xiàn)數(shù)據(jù)加載。從某種角度可以將 URLRequest理解為建立請(qǐng)求的工具。要是URLRequest類(lèi)對(duì)象變成可用的對(duì)象還需得通過(guò)其他類(lèi)來(lái)與之配合協(xié)作,詳細(xì)見(jiàn)后面使用 URLLoader加載數(shù)據(jù)。
URLRequest雖然功能強(qiáng)大,使用簡(jiǎn)單。但我們還是需要了解更多的東西,以便可以正確的應(yīng)用URLRequest類(lèi)和處理相應(yīng)的錯(cuò)誤。其中最引人關(guān)注的就是安全沙箱的問(wèn)題,這部分我將在以后的文章中介紹,這里只需要記住兩點(diǎn)就OK。
1、如果執(zhí)行調(diào)用的 SWF 文件在只能與本地文件系統(tǒng)內(nèi)容交互的沙箱中,而目標(biāo)資源來(lái)自網(wǎng)絡(luò)沙箱,則不允許進(jìn)行數(shù)據(jù)加載。
2、如果執(zhí)行調(diào)用的 SWF 文件來(lái)自網(wǎng)絡(luò)沙箱而目標(biāo)資源在本地,也不允許進(jìn)行數(shù)據(jù)加載。
這里就簡(jiǎn)單介紹這些,關(guān)于URLRequest的詳細(xì)資料大家可以查看官方提供的在線(xiàn)文檔:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLRequest.html
三、使用URLLoader加載數(shù)據(jù)
URLLoader 類(lèi)可以以文本、二進(jìn)制數(shù)據(jù)或 URL 編碼變量的形式從 URL 下載數(shù)據(jù)。下面將結(jié)合使用本地服務(wù)器上的數(shù)據(jù)(詳細(xì)見(jiàn)文章前面的xml文件定義)的加載示例來(lái)演示URLLoader的使用方法。
那我們?cè)趺赐ㄟ^(guò)URLLoader來(lái)加載它呢?很簡(jiǎn)單,使用上面介紹的URLRequest來(lái)創(chuàng)建請(qǐng)求連接,然后將URLRequest對(duì)象傳遞給URLLoader的load方法來(lái)實(shí)現(xiàn)數(shù)據(jù)加載。
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 }
下面是整個(gè)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數(shù)據(jù)">
21 <mx:DataGrid x="10" y="10" width="377" id="bookGrid">
22 <mx:columns>
23 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
24 <mx:DataGridColumn headerText="書(shū)名" dataField="Name"/>
25 <mx:DataGridColumn headerText="作者" dataField="Author"/>
26 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
27 </mx:columns>
28 </mx:DataGrid>
29 <mx:ControlBar height="42">
30 <mx:Button label="加載數(shù)據(jù)" fontWeight="normal" click="onClick()"/>
31 </mx:ControlBar>
32 </mx:Panel>
33 </mx:Application>
34
本示例的運(yùn)行結(jié)果如下圖:
關(guān)于URLLoader的更多資料大家可以查看Adobe提供的在線(xiàn)文檔:http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/URLLoader.html