Основной класс:
Код: Выделить всё
package api { import flash.events.*; import flash.net.*; import api.*; import com.adobe.crypto.MD5; public class APILoaderWip extends EventDispatcher { // * Обязательные параметры запроса public var api_id:String = "1111111"; // ID приложения (взять из враппера) public var method:String = "isAppUser"; // Метод запроса public var sig:String = "md5_signature"; // Подпись запроса (вычисляется) // * Дополнительные параметры запроса public var parameters:Array = new Array(); // Массив доп. параметров методов public var v:String = new String(); // Версия API public var format:String = new String(); // XML или JSON public var test_mode:String = new String(); // 1 или 0 // * Прочие прараметры, необходимые для работы public var api_url:String = "http://api.vkontakte.ru/api.php"; // URL для запроса (взять из враппера) public var viewer_id:String = "1111111"; // ID текущего пользователя (взять из враппера) public var api_secret:String = "api_secret"; // Ключ приложения для НЕбезопасного взд-я // * Параметры для v=3.0 * public var secret:String = "1111111"; // secret приложения из flashVars public var sid:String = "1111111"; // ID сессии // * Рабочие переменные * public var data:String; private var requestParameters:Array; private var loader:URLLoader; private var wrapper:Object; public function APILoaderWip(external_wrapper:Object) { wrapper = external_wrapper; secret = wrapper.application.parameters.secret; // для v=3.0 sid = wrapper.application.parameters.sid; // для v=3.0 api_id = wrapper.application.parameters.api_id; api_url = wrapper.application.parameters.api_url; viewer_id = wrapper.application.parameters.viewer_id; } public function doRequest():void { // составляем массив параметров; requestParameters = new Array(); requestParameters.push(new APIParameter("api_id", api_id)); requestParameters.push(new APIParameter("method", method)); if (v) requestParameters.push(new APIParameter("v", v)); if (format) requestParameters.push(new APIParameter("format", format)); if (test_mode) requestParameters.push(new APIParameter("test_mode", test_mode)); if (parameters.length > 0) { requestParameters = requestParameters.concat(parameters); } // вычисляем подпись if (v == "3.0") api_secret = secret; // для v=3.0 sig = MD5.hash(getRawSig()); // осуществляем вызов к API var request:URLRequest = new URLRequest(api_url); var variables:URLVariables = new URLVariables(); for (var i:int = 0; i < requestParameters.length; i++) { variables[APIParameter(requestParameters[i]).getName()] = APIParameter(requestParameters[i]).getValue(); } variables.sig = sig; if (v == "3.0") variables.sid = sid; request.data = variables; request.method = URLRequestMethod.POST; loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); loader.load(request); } // ****************************************************************************** private function completeHandler(e:Event):void { loader.removeEventListener(Event.COMPLETE, completeHandler); loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);// trace("[API Loader] completeHandler"); data = loader.data; dispatchEvent(new Event(Event.COMPLETE)); //dispatchEvent(e); } private function securityErrorHandler(e:SecurityErrorEvent):void { loader.removeEventListener(Event.COMPLETE, completeHandler); loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);// trace("[API Loader] securityErrorHandler"); dispatchEvent(new Event(SecurityErrorEvent.SECURITY_ERROR)); //dispatchEvent(e); } private function ioErrorHandler(e:IOErrorEvent):void { loader.removeEventListener(Event.COMPLETE, completeHandler); loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);// trace("[API Loader] ioErrorHandler"); dispatchEvent(new Event(IOErrorEvent.IO_ERROR)); //dispatchEvent(e); } private function httpStatusHandler(e:HTTPStatusEvent):void { loader.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);// trace("[API Loader] HTTP status: "+e.status); dispatchEvent(e); } public function getRawSig():String { var rawSig:String = new String(); requestParameters.sort(); for (var i:int = 0; i < requestParameters.length; i++) { rawSig += APIParameter(requestParameters[i]).toAPIString(); } return viewer_id + rawSig + api_secret; } }}
Доп. класс:
Код: Выделить всё
package api { public class APIParameter { private var name:String; private var value:String; public function APIParameter(external_name:String, external_value:String) { this.name = external_name; this.value = external_value; } public function toString():String { return " " + name + ":" + value; } public function toAPIString():String { return name + "=" + value; } public function getName():String { return name; } public function getValue():String { return value; } }}
Только должен сказать, что в основной класс передается ссылка на wrapper. Для работы без него придется подкорректировать все это дело...
Использование:
Код: Выделить всё
var preLoader:APILoaderWip = new APILoaderWip(wrapper);preLoader.api_secret = "1sdf24f2g";preLoader.v = "3.0";preLoader.method = "execute";preLoader.test_mode = "1"; var code = 'return {"adverts": API.getAds()}';preLoader.parameters.push(new APIParameter("code", code)); preLoader.addEventListener(Event.COMPLETE, LoaderCH);preLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, LoaderEHSecurity);preLoader.addEventListener(IOErrorEvent.IO_ERROR, LoaderEHio);preLoader.doRequest();