FLash 在安全方面的保守让它成为了最安全和最广泛的 RIA 应用开发技术,但是对程序员来说那可能不会那么轻松了,比如最简单的 http 请求,通常会被系统拦截,所以我们需要一种再底层的方式来实现 Http 请求。
以下是 ActionScript 中最常用的 Http 请求的使用代码
package {
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
public class URLRequestDemo extends Sprite {
public function URLRequestDemo () {
//Url String
var url:String = "http://www.lidaren.com/";
var loader:URLLoader = new URLLoader();
//add EventListener
//Load Complete
loader.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(url);
//Http Request Method
request.method = URLRequestMethod.POST;
try {
//Load
loader.load(request);
} catch (error:Error) {
trace("无法加载请求的文档。");
}
}
private function completeHandler(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
trace("数据内容:" + loader.data);
}
}
以上代码通过 URLLoader 来装载 URLRequest 获取的数据并输出,但是问题就是出在这里,如果 flash 的安全设置不允许 URLRequest,那就..
简单讲一下 Flash 是如何发送 Http 请求的过程,flash 首先检查目标站点的下是否存在 crossdomain.xml,存在则读取并加载到安全策略中,没有则使用默认的安全策略,crossdomain.xml 中如允许请求,那么允许连接,否则拦截,这一点与其他的语言不同,所以使用时需要注意,其他的跟一般大家最常用的 socket 的通信方式一样的,建立 Scoket 连接 -> 发送 Socket 请求包 -> 监听接受数据 -> 关闭 socket 连接。
演示代码如下:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.Socket;
import flash.system.Security;
public class SocketDemo extends Sprite
{
public var port:int = 80;
public var host:String = "www.lidaren.com";
public var sock:Socket;
public var buffer:String;
public function SocketDemo()
{
sock = new Socket();
sock.addEventListener(Event.CONNECT,connectHandler);
sock.addEventListener(Event.CLOSE,closeHandler);
sock.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
sock.addEventListener(Event.COMPLETE,completeHandler);
Security.loadPolicyFile("http://"+host+":"+port+"/crossdomain.xml");
sock.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{trace("ioerr");});
sock.connect(host,port);
}
//完毕
public function completeHandler(event:Event):void {
trace("completeHandler:"+event.target.data);
}
//关闭
public function closeHandler(event:Event):void {
trace("close handler");
}
public function connectHandler(event:Event):void {
trace("连接...成功");
//设置Http请求头,其他协议的请求亦可
var header:String = "GET /filename.xxx HTTP/1.1 rn";
header += "Accept: \*/\* rn"
header += "Accept-Language: zh-cn rn";
header += "User-Agent: Mozilla/4.0";
header += "Host: " + host + ":" + port + " rn";
header += "Connection: Keep-Alive rn";
header += "Cache-Control: no-cache rnrn";
//写入请求头
sock.writeUTFBytes(header);
//清空缓冲区,发送请求
sock.flush();
}
//收到数据
public function socketDataHandler(event:ProgressEvent):void {
trace("socketDataHandler:"+event.bytesLoaded);
var data:String = sock.readUTFBytes(sock.bytesAvailable);
buffer += data;
trace("数据->"+buffer);
}
}
以上代码部分参考自 Adobe 官方 AS3 programming 手册。如有问题,大家可以参考 Adobe 提供的准确代码