| caseyryan |
11.03.2016 07:56 |
Ошибка 2101 key value pairs. Как обойти?
Есть URLLoader которые запрашивает у определенного php скрипта юникстайм.
Вот как происходит сам запрос
Код AS3:
/**
*
* @param название метода, который нужно вызывать на сервере, передается в
* POST с ключом method
* @param callback метод который вызывается после прихода ответа от сервера
* должен принимать один параметр типа Object
*/
public function NetPacket(method:String, callback:Function, params:Object = null) {
_callback = callback;
var loader: URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
loader.dataFormat = URLLoaderDataFormat.TEXT; // изначально ставил VARIABLES, потом заменил на TEXT, но проблема осталась
var vars:URLVariables = new URLVariables();
vars['method'] = method;
if (params != null) {
for (var i:String in params) {
vars[i] = params[i];
}
}
var rand: String = "?" + int(Math.random() * 10000);
var request:URLRequest = new URLRequest(NetPacket.HOST + NetPacket.SCRIPT + rand);
request.method = URLRequestMethod.POST;
request.data = vars;
trace(request.data.toString());
try {
loader.load(request);
} catch (e:Error) {
trace(e.getStackTrace());
}
}
private function onSecurityError(e:SecurityErrorEvent):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
}
private function onIOError(e:IOErrorEvent):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
}
private function onComplete(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
try {
var data:Object = e.target.data;
trace("PACKET DATA:", this, unescape(String(data)));
if (_callback != null) {
_callback.call(null, data);
}
} catch (err:Error) {
Console.log(err.message);
}
}
Проблема в том, что если скрипт, по какой-нибудь причине (отвал интернета, сбой связи, происки вражеских спецслужб, божественное вмешательство) вернет какую-нибуль околесицу, то вываливается вот такая ошибка
Цитата:
Error 2101: The String passed to URLVariables.decode() must be a URL-encoded query string containing name/value pairs.
|
Которая уже просто заколебала. Никакие try / catch (причина, видимо, гораздо глубже) или подписки на UncaughtErrorEvent не помогают (в главном классе, кстати, есть на них подписка)
Код AS3:
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
}
Из-за этой фигни иногда (к счастью очень редко, но тем не менее), отваливается вся игра.
Кто-нибудь поборол эту гадость?
|