FLASH AS3 中使用URLRequest 和URLLoader 与服务器交互

request|服务器|交互

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 包中,如使用:

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=Keirago

LoadVariablesOnly.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");}
[Ctrl+A 全部选择 然后拷贝]

2. 提交数据到 ServerSide.asp, 并输出服务器的返回值

ServerSide.asp

代码拷贝框
<%@LANGUAGE="JSCRIPT" 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);%>
[Ctrl+A 全部选择 然后拷贝]

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");}
[Ctrl+A 全部选择 然后拷贝]

点击这里下载源文件

时间: 2024-08-29 10:56:12

FLASH AS3 中使用URLRequest 和URLLoader 与服务器交互的相关文章

flash as3 中动态加载库类失败解决方法

flash as3 中动态加载库类失败解决方法 这是错误的写法 for (var i:number=1; i<4; i++) { var mc1:mc1 = new mc1(); addchild(mc1); } as3里怎么循环加载库里的mc1 mc2 mc3类 就是下面意思是怎样个的写法 for (var i:number=1; i<4; i++) { var "mc"+i:"mc"+i = new "mc"+i(); addch

html和xml中的转义字符在Flash as3中的用法浅析

在as3中使用特殊字符的时候,不小心就会出现错误,要么字符没有被显示,要么显示的不对,本文章就此做一个简单的分析,如有更好的分析,请一定要跟贴. sample.xml和sample_cdata.xml是本例需要用到的xml文件,请点击查看他们的内容,本例以特殊字符< 和> 为例:文本字符串变量为txt, 显示文本的名称为shwo_txt. 由于html和xml中<和>有特殊含义,不能直接使用,使用这两个字符时,应使用他们的转义序列,也即<和>,故在xml文件中<

Flash AS3 中的反射 — Reflection

谢草莓和 yhc13 提供人肉翻译机支持 什么是反射反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等 反射有什么用在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法

flash AS3中的Loading加载进度条实现代码

比如说我们有一个主Flash叫main.swf,然后有一个Load.swf,只要在Load.swf中写入如下代码即可下载main.swf播放:  代码如下 复制代码 var request:URLRequest = new URLRequest("main.swf"); var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgr

flash as3中换行符无效解决办法

如今从xml中加载进来并读出的字符串中的换行符不起作用 我很郁闷,多次查查不到什么原因 但试出了用<br/>代替n可以解决此问题 最后才找到了原因.原来不知道为什么xml中的n都变成了\n 所以解决的办法有两个: (1)用<br/>代替n (2)把\n换成n:data.text = data.text.replace(/\n/g,"n");//解决n换行符不起作用的问题..

flash as3中MVC使用说明详解

data层的功能: 1.封装与服务器通信的功能,提供call()接口让外部(一部是View)调用完成向服务器发送数据的功能 2.处理和解析服务器返回的数据.比如服务器返回数据后,data里的一个函数被调用,这个函数根据协议实现读取数据包的功能,读完后把数据填充到自己实例变量中 3.提供侦听接口path(协议,回调函数),让外部(一般是View),侦听所关心的协议,一旦服务器返回这个协议,回调函数就会被执行. VIEW的功能: 1.控制UI,响应用户交互 2.调用data.path方法,侦听自己关

AS3中新的XML处理方法 - E4X

xml 今天我们来看看AS3中新的XML处理方法:E4X,直到现在,ECMA脚本语言规范(ECMA-262)--AscriptScript 3.0的核心基础,并没有提供任何的XML数据处理类或方法.AcriontScript之前的版本(从Flash 5中的ActionScript开始)有一些处理XML数据的类和方法,但是它们并不是基于ECMAScript标准的. 新的ECMA脚本语言规范第4版草稿中定义了一系列新的处理XML数据的类和方法.这些类和方法的集合并命名为E4X("ECMAScript

flash as3获取php的变量值实现方法

HP代码 (test1.php): 不推荐写成这种含html代码的形式:  代码如下 复制代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

flash as3.0加载swf失败解决方法

flash as3.0加载swf代码怎么写?如已有1.swf,用2.fla加载,在2.fla里的代码怎么写 补充:2.fla里已有一段,加载1.swf是想放完2.fla前一段后接着放2.swf的.所以代码是要写到2.fla本身的最后一帧的吧   var my_urlloader:loader=new loader(); my_urlloader.load(new urlrequest("swf.swf")); my_urlloader.contentloaderinfo.addeven