搜尋部落格文章

2011年11月12日 星期六

[轉] AS3使用URLRequest和URLLoader與伺服器溝通

AS3 中使用URLLoader 與URLRequest 取代了先前版本LoadVars 方法. 初學者可能又會迷糊了.
在現在幫助系統沒有完善的情況下(Flash 9 沒有幫助, Flex Builder 2 的只有英文), 這裡寫篇簡單的教程, 方便大家往AS3 過渡.

在AS3 中, 有關於網路操作的內置類全部在flash.net 裡. 下面是本教程要用到的類的清單 :

URLLoader : 用於從網路或者本地讀取文件, 可以通過設置他的dataFormat 屬性改變收到的文本類型.
與AS2 的LoadVars 不同的是, 他的默認值URLLoaderDataFormat.TEXT 即純文字格式, 所以在讀取外部文本變量的時候得修改一下他的dataFormat 為URLLoaderDataFormat.VARIABLES. 不過在AS2 中沒有該屬性, 取代的是contentType 屬性.

URLRequest : 用於傳遞變量到伺服器, 以及URLLoader 要load 的目標路徑. 可以通過設置他的contentType 屬性改變發送到伺服器的變量類型, 默認是application/x-form-urlencoding, 也就是URLEncode 編碼.

URLVariables : 用於配置傳遞到伺服器變量的鍵/ 值集合, 如user1=Kakera&user2=Eigo.

URLLoaderDataFormat : 用於設置URLLoader 讀取文件的類型, 有TEXT (純文字), VARIABLES (URLEncoding 的鍵/ 值集合), BINARY (2 進制格式), URLLoader 會根據相應的類型進行解碼操作, 如解碼URLEncode

同時還有其他不常用的 :
URLRequestMethod : 決定使用哪種方式傳遞數據到伺服器, POST 或者GET.
URLReqeustHeader : 用於配置傳遞到服務端的HTTP 標頭.

值得一提的是, URLLoader 還有相當完整的事件讓我們來獲取讀取數據的狀態, 下面是有關URLLoader 事件的清單.

complete : 使用URLLoader.load() 方法後, 數據完全加載完畢時觸發, 通常如果能夠觸發這個事件的話, 說明你的程序沒有問題.

httpStatus : 使用URLLoader.load() 方法後, 獲取HTTP 狀態代碼時觸發, 通過判斷他的state 屬性我們可以獲得遠程文件的加載狀態. 成功(200), 沒有權限(403), 找不到文件( 404), 伺服器內部錯誤(500) 等等. 這個事件總是在compelete 之前被觸發.

ioError : 使用URLLoader.load() 方法時, 發生致命錯誤時觸發, 我還沒碰到過..

open : 使用URLLoader.load() 方法後, 開始從伺服器下載數據時觸發一次, 此時的URLLoader.bytesLoaded 一定是0.

progress : 使用URLLoader.load() 方法後, 在從伺服器下載數據的過程中持續觸發, 通過偵聽他的變化我們可以很方便的為URLLoader 做加載狀態的顯示.

securityError : FlashPlayer 的安全錯誤, 比如跨域加載, 從硬盤(文件系統) 發送/ 讀取伺服器上的數據.

關於註冊偵聽器的建議

flashplayer 內置類的所有事件都有相關事件類常量來表示, 推薦使用他們來註冊事件偵聽器. 而所有的內置類的事件類(Event) 全部在flash.events 包中,如使用:
window.attachEvent("onload",function (){AutoSizeDIV('CODE_7643')}) import flash.events.Event;
urlLoaderInstance.addEventListener(Event.COMPLETE, completeHandler);



來代替
urlLoaderInstance.addEventListener("complete", completeHandler);下面是URLLoader 支持的事件所對應類的清單, 他們可以在Flex Builder 2 的文檔中找到:

complete : Event.COMPLETE
httpStatus : HTTPStatusEvent.HTTP_STATUS
ioError : IOErrorEvent.IO_ERROR
open : Event.OPEN
progress : ProgressEvent.PROGRESS
securityError : SecurityErrorEvent.SECURITY_ERROR

然後下面是使用URLLoader 的一些簡單的例子

1. 單純的讀取伺服器或者硬盤上同目錄下叫Variables.txt 文本文件, 文本的內容是:
user1=Kakera&user2=Eigo&user3=KeiragoLoadVariablesOnly.fla
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置 URLRequest, 設置目標路徑等
//

var request:URLRequest = new URLRequest("Variables.txt");
/
// 配置 URLLoader, 註冊偵聽器等
//

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
 trace("Event.COMPLETE");
 trace("目標文件的原始數據(純文字) : " + loader.data);
 //
 // 使用URLVariables 處理原始數據並進行遍歷同時輸出數據
 //
 
 var variables:URLVariables = new URLVariables(loader.data);
 for (var i in variables) {
  trace(i + " : " + variables[i]);
 }

}
function loader_open (e:Event):void {
 trace("Event.OPEN");
 trace("讀取了的字節: " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
 trace("HTTPStatusEvent.HTTP_STATUS");
 trace("HTTP 狀態代碼 : " + e.state);
}
function loader_progress (e:ProgressEvent):void {
 trace("ProgressEvent.PROGRESS");
 trace("讀取了的字節: " + loader.bytesLoaded);
 trace("文件總字節 : " + loader.bytesTotal);
}
function loader_security (e:Secu​​rityErrorEvent):void {
 trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
 trace("IOErrorEvent.IO_ERROR");
}






2. 提交數據到ServerSide.asp, 並輸出伺服器的返回值

ServerSide.asp <%@LANGUAGE="Jscrīpt" CODEPAGE="65001"%>
<%  //  // 全局 Header, 設置編碼, 以及緩存  //  with (Response) {   Charset = "utf-8";   Buffer = true;   Expires = -10;   ContentType = "text/plain";  }    var buffer = "列出所有服務端接收到的變量: /n";  var i;  var e = new Enumerator(Request.Form);      //  // 遍歷集合  //    for (; !e.atEnd(); e.moveNext()) {   i = e.item();   buffer += String(i) + " : " + String(Request.Form(i)) + "/n";  }    Response.Write(buffer); %>

SendAndLoadVariables.fla

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置URLVariables, 設置傳遞到伺服器的數據
//
 
var variables:URLVariables = new URLVariables();
variables.userName = "Kakera";
variables.password = "********";


//
// 配置URLRequest, 設置目標路徑, 設置提交的數據, 方法(POST / GET)
//

var request:URLRequest = new URLRequest("http://localhost/urlloadersample/ServerSide.asp");
request.data = variables;
request.method = URLRequestMethod.POST;


//
// 配置 URLLoader, 註冊偵聽器等
//

var loader:URLLoader = new URLLoader();


//
// 服務端將要返回的是純文字數據
//

loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
 trace("Event.COMPLETE");
 trace("目標文件的原始數據(純文字) : /n" + loader.data);
}
function loader_open (e:Event):void {
 trace("Event.OPEN");
 trace("讀取了的字節: " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
 trace("HTTPStatusEvent.HTTP_STATUS");
 trace("HTTP 狀態代碼 : " + e.status);
}
function loader_progress (e:ProgressEvent):void {
 trace("ProgressEvent.PROGRESS");
 trace("讀取了的字節: " + loader.bytesLoaded);
 trace("文件總字節 : " + loader.bytesTotal);
}
function loader_security (e:Secu​​rityErrorEvent):void {
 trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
 trace("IOErrorEvent.IO_ERROR");

}

原文連結

沒有留言:

張貼留言