Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка 2101 key value pairs. Как обойти? (http://www.flasher.ru/forum/showthread.php?t=212555)

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);
            }

Из-за этой фигни иногда (к счастью очень редко, но тем не менее), отваливается вся игра.

Кто-нибудь поборол эту гадость?

Wolsh 11.03.2016 11:23

Может написать свой unescape, а лучше проверку String(data) на соответствие формату "URL-encoded query string containing name/value pairs" ? Например, тем же регэксом.

undefined 11.03.2016 12:51

а в каком месте выскакивает эрор? Можно слать данные строкой, в виде джейсона и парсить на сервере.

caseyryan 11.03.2016 14:04

Цитата:

Может написать свой unescape, а лучше проверку String(data) на соответствие формату "URL-encoded query string containing name/value pairs" ? Например, тем же регэксом.
Я малость заработался, тупанул) Да, этот способ решает проблему если поставить вместо VARIABLES TEXT.
Я поставить то поставил, а билд старый запустил на девайсе, поэтому и отвалилось. Уже после того как тему создал, заметил.
Но все равно странно, что приходится какие-то костыли изобретать. Ведь ошибка вываливается где-то "за кадром", между вызовом load() и обработчиком. Поэтому и try / catch не работает
Цитата:

Можно слать данные строкой, в виде джейсона и парсить на сервере.
Тут как раз наоборот надо, обрабатывать ответ сервера, которые по разным причинам бывает битый.

undefined 11.03.2016 14:23

Цитата:

Тут как раз наоборот надо, обрабатывать ответ сервера, которые по разным причинам бывает битый.
Ну так конструктор URLVariables принимает строку же.Скармливай ему ответ сервера и оборачивай в try/catch

Добавлено через 1 минуту
для этого естественно надо тип URLLoaderDataFormat.TEXT; выставлять

Добавлено через 3 минуты
то, что URLLoader кидает эксепшен у себя внутрях при неправильном ответе - это известная грабля

GBee 11.03.2016 14:27

Цитата:

Да, этот способ решает проблему если поставить вместо VARIABLES TEXT.
Хотел посоветовать, а в изначальном тексте так и есть. :о))
Очень странно, что скрипт такое возвращает. Может в возвращаемых данных какие-нить спецсимволы портят ответ? Типа другой кодировки и т.п.?

i.o. 11.03.2016 15:02

Стектрейс ошибки есть?

undefined 11.03.2016 15:29

стектрейс там ведет внутрь urlLoader'а и возникает в момент получения ответа, но перед диспачингом события поэтому туда(к месту, где возникает эррор) не добраться.Странно, что adobe не завел какой-нибудь ивент на этот случай.

caseyryan 11.03.2016 18:48

Цитата:

Стектрейс ошибки есть?
Не, оно в этом случае вообще не доходит до блока try / catch. Самое стремное, что из-за такой ошибки релиз билд на мобиле не отваливается полностью, а какая-то часть кода перестает работать и возникают очень странные баги. Я смог понять где валится только после того как сделал отладочный билд и приконнектил отладчик к компу. Почему-то при тестах с компа ошибка воспроизводится гораздо реже

dimarik 11.03.2016 22:38

На секундочку показалось, что проблема в формате отправляемых данных URLVariables, которые делают decode в момент отправки.

Добавлено через 5 минут
И что там с глобальным кэтчем, вообще не ловит мышей? Как он реагирует на throw "catch me if u can"?


Часовой пояс GMT +4, время: 11:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.