天天看點

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:SecurityErrorEvent):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:SecurityErrorEvent):void {

 trace("SecurityErrorEvent.SECURITY_ERROR");

}

function loader_ioError (e:IOErrorEvent):void {

 trace("IOErrorEvent.IO_ERROR");

}