在Flash中使用AMF3数据格式有什么的好处我就不用重复说了,我主要把把代码贴出来,希望对相关人员有些帮助吧
AMF3Connection类
- package com.klstudio.net {
- import com.klstudio.events.AMF3ConnectionEvent;
- import flash.events.EventDispatcher;
- import flash.net.URLRequest;
- import flash.net.ObjectEncoding;
- import flash.utils.ByteArray;
- import flash.net.URLLoaderDataFormat;
- import flash.net.URLLoader;
- import flash.events.SecurityErrorEvent;
- import flash.events.IOErrorEvent;
- import flash.events.Event;
- import flash.net.URLRequestMethod;
- import flash.utils.Dictionary;
- /**
- * amf3连接类
- * @author Kinglong
- * @mail:kinglong@gmail.com
- * @since:2010-5-21
- */
- [Event(name="success" , type="com.klstudio.events.AMF3ConnectionEvent" )]
- [Event(name="failed" , type="com.klstudio.events.AMF3ConnectionEvent" )]
- public class AMF3Connection extends EventDispatcher{
- private var _url:String;
- private var _requestMethod:String;
- private var _loaders:Dictionary;
- private var _compressed:Boolean;
- public function AMF3Connection(url:String,compressed:Boolean=false ){
- _url = url;
- _requestMethod = URLRequestMethod.POST;
- _loaders = new Dictionary(true );
- _compressed = compressed;
- }
- public function isCompressed():Boolean{
- return _compressed;
- }
- public function get requestMethod():String{
- return _requestMethod;
- }
- public function set requestMethod(value:String):void {
- _requestMethod = value;
- }
- public function get url():String{
- return _url;
- }
- public function call(method:String,callback:Function=null ,args:Array=null ):void {
- var request:AMF3Request = new AMF3Request(method, callback, args);
- trace(this ,"request>" + request.toString());
- var bytes:ByteArray = new ByteArray();
- bytes.writeObject(request.data);
- bytes.objectEncoding = ObjectEncoding.AMF3;
- if (_compressed) {
- bytes.compress();
- }
- trace(this ,"url>" + url);
- var req:URLRequest = new URLRequest(url + "?r=" + Math.random());
- req.method = requestMethod;
- req.data = bytes;
- var loader:URLLoader = new URLLoader();
- addLoaderHandler(loader);
- loader.load(req);
- _loaders[loader] = request;
- }
- private function loaderHandler(event:Event):void {
- var loader:URLLoader = event.target as URLLoader;
- removeLoaderHandler(loader);
- var request:AMF3Request = _loaders[loader];
- var response:AMF3Response = new AMF3Response(request,"没有响应请求" ,AMF3Response.STATE_ERROR);
- trace(this ,event.type);
- switch (event.type){
- case Event.COMPLETE:
- try {
- var bytes:ByteArray = loader.data as ByteArray;
- if (_compressed) {
- bytes.uncompress();
- }
- response = AMF3Response.parse(request,bytes.readObject());
- }catch (error:Error){
- trace(this ,error.message);
- response = new AMF3Response(request,"不能解析返回对象" ,AMF3Response.STATE_ERROR);
- }
- break ;
- case IOErrorEvent.IO_ERROR:
- response = new AMF3Response(request,"访问地址[" +url+"]出错" ,AMF3Response.STATE_ERROR);
- break ;
- case SecurityErrorEvent.SECURITY_ERROR:
- response = new AMF3Response(request,"Flash不能跨域访问" ,AMF3Response.STATE_ERROR);
- break ;
- }
- dispatchEvent(new AMF3ConnectionEvent(response.isSuccess()?AMF3ConnectionEvent.SUCCESS:AMF3ConnectionEvent.FAILED, response));
- if (request.callback != null ) {
- request.callback.call(null , response);
- }
- delete _loaders[loader];
- loader.close();
- loader = null ;
- }
- private function addLoaderHandler(loader:URLLoader):void {
- loader.dataFormat = URLLoaderDataFormat.BINARY;
- loader.addEventListener(Event.COMPLETE, loaderHandler);
- loader.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler);
- loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);
- }
- private function removeLoaderHandler(loader:URLLoader):void {
- loader.removeEventListener(Event.COMPLETE, loaderHandler);
- loader.removeEventListener(IOErrorEvent.IO_ERROR, loaderHandler);
- loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);
- }
- }
- }
AMF3ConnectionEvent类
- package com.klstudio.events {
- import com.klstudio.net.AMF3Response;
- import flash.events.Event;
- /**
- * amf3连接事件
- * @author Kinglong
- * @mail:kinglong@gmail.com
- * @web:http://www.klstudio.com
- * @since:2010-5-22
- */
- public class AMF3ConnectionEvent extends Event {
- public static const SUCCESS:String = "success" ;
- public static const FAILED:String = "failed" ;
- private var _response:AMF3Response;
- public function AMF3ConnectionEvent(type : String, response:AMF3Response,bubbles:Boolean=false ,cancelable:Boolean=false ) {
- super (type, bubbles, cancelable);
- _response = response;
- }
- public function get response():AMF3Response{
- return _response;
- }
- override public function clone() : Event {
- return new AMF3ConnectionEvent(type,response,bubbles,cancelable);
- }
- }
- }
AMF3Request类
- package com.klstudio.net {
- /**
- * amf3请求类
- * @author Kinglong
- * @mail:kinglong@gmail.com
- * @web:http://www.klstudio.com
- * @since:2010-5-21
- */
- public class AMF3Request {
- private var _method:String;
- private var _callback:Function;
- private var _args:Array;
- public function AMF3Request(method:String,callback:Function=null ,args:Array=null ){
- _method = method;
- _callback = callback;
- _args = args;
- }
- public function get method():String{
- return _method;
- }
- public function get callback():Function{
- return _callback;
- }
- public function get args():Array{
- return _args;
- }
- public function get data():Object{
- if (args == null || args.length == 0 ){
- return {method:method};
- }else {
- return {method:method,args:args};
- }
- }
- public function toString():String{
- return "AMF3Request[method=" +method+",callback=" +((callback == null )?"null" :"Function" )+",args=[" +args+"]]" ;
- }
- }
- }
AMF3Response类
- package com.klstudio.net {
- /**
- * amf3响应类
- * @author Kinglong
- * @mail:kinglong@gmail.com
- * @web:http://www.klstudio.com
- * @since:2010-5-22
- */
- public class AMF3Response {
- public static const STATE_SUCCESS:String = "00" ;
- public static const STATE_ERROR:String = "99" ;
- private var _message:String;
- private var _result:Object;
- private var _state:String;
- private var _request:AMF3Request;
- public static function parse(request:AMF3Request,obj:Object):AMF3Response{
- if (obj == null ) return null ;
- if (!obj.hasOwnProperty("state" )) return null ;
- if (!obj.hasOwnProperty("message" ) && !obj.hasOwnProperty("result" )) return null ;
- var response:AMF3Response;
- if (obj["state" ] == AMF3Response.STATE_SUCCESS){
- response = new AMF3Response(request,obj["result" ]);
- }else {
- response = new AMF3Response(request,obj["message" ],obj["state" ]);
- }
- return response;
- }
- public function AMF3Response(request:AMF3Request,context:*,state:String="00" ) {
- _request = request;
- _state = state;
- if (isSuccess()) {
- _result = context;
- } else {
- _message = context;
- }
- }
- public function get request():AMF3Request{
- return _request;
- }
- public function get message():String{
- return _message;
- }
- public function get result():Object{
- return _result;
- }
- public function get state():String{
- return _state;
- }
- public function isSuccess():Boolean{
- return _state == AMF3Response.STATE_SUCCESS;
- }
- public function toString() : String {
- return "AMF3Response[request=" +request+",state=" +state+",message=" +message+",result=" +result+"]" ;
- }
- }
- }
调用实例
- import com.klstudio.net.AMF3Connection;
- import com.klstudio.net.AMF3Response;
- AMF3Connection amf3conn = new AMF3Connection(url,true );
- function callback(response:AMF3Response){
- trace(response);
- }
- amf3conn.call("checkLogin" , callback);