AS3的URLLoader本身没有提供解析HTTP头部的功能,而在应用中,我们偶尔也会需要去解析HTTP头部,可以通过HTTP头部获取一些状态信息或者一些其他数据。

幸好AS3提供了Socket类,我们可以利用Socket来模拟HTTP请求,解析HTTP头部以及返回的内容。基本原理很简单:连接服务器的80端口或者其他web端口,向服务器发送请求头,基本上和下面类似:

GET /web/crystal/v1.1Beta01Build011/crystal_ext-min.js HTTP/1.1
Accept: */*
Accept-Language: zh-cn
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Accept-Encoding: deflate
Host: adsfile.qq.com
Connection: Keep-Alive

这里需要注意的是,由于要获取请求返回的内容,因此Accept-Encoding不能写上gzip,否则你要从gzip中解压内容啦!

在发送请求完成以后就可以等待接受数据了,接受到的是字节流,因此需要decode。AS3的ByteArray对象可以从字节流中按照一定编码读取内容。由于内容的编码不一,但是header里面是可以用UTF8读取的,因此可以先一个一个字符地读出来,到header结束后在换其他编码,比如header里面指定的编码。header结束的标记是两个换行(\r\n\r\n),因此只要独到连续两个换行就代表头部已经结束了,剩下的就是内容了,用ByteArray的readMultiByte用指定编码读取出来就可以了。

具体实现的源代码可以看这里:http://code.google.com/p/fookie/source/browse/trunk/http_loader/

其实现的类为HTTPLoader,和URLLoader类似,事件是一样的,使用方法也一样,不过返回的对象是一个HTTPResponse对象,包括status、headers和body三个属性。status是请求返回的状态码,headers包含所有返回的头部,body是返回的内容,content是body的别名属性,内容和body一样。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.