Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Зачем URLLoader`у свойство dataFormat (http://www.flasher.ru/forum/showthread.php?t=182048)

elder_Nosferatu 10.07.2012 15:53

Зачем URLLoader`у свойство dataFormat
 
Вроде глупый вопрос, но вот ситуация:
перед началом загрузки пишем
Код AS3:

loader.dataFormat = URLLoaderDataFormat.VARIABLES;

Если мой сервер всегда отвечает в формате ключ-значение, тогда все ОК, но в случае необработаной ошибки php-скрипта я получаю ответ в формате XML с описанием проблемы (фактически "сырой" текст). В этом случае мое приложение начинает матом ругаться:
Код:

Error: Error #2101: Строка, переданная в URLVariables.decode(), должна быть
строкой запроса закодированного URL-адреса и содержать пары имя/значение.
        at Error$/throwError()
        at flash.net::URLVariables/decode()
        at flash.net::URLVariables()
        at flash.net::URLLoader/onComplete()

Конечно, если вся работа зависить от сервера, тогда я не там копаю, но если данные, которые я запросил для приложения не критичны (новости для бегущей строки, какая то рекламма или таблица рекордов для игры), тогда такое поведение весьма удручает...

И не говорите мне:
Код:

ипользуй  URLLoaderDataFormat.BINARY или URLLoaderDataFormat.TEXT
. Я так и делаю... Просто интересно, зачем такая хорошая плюшка, которая в определенных условиях превращается в ПЛЮХУ-ЗА-УХО.

Пэ.Эс.: Вместо того, чтобы спокойно отловить IOErrorEvent, я так же получаю этот результат. Так что не обязательно гнать на плохо написаный сервер. Он может быть просто недоступен и уже этим портить и без него неплохую картину.

caseyryan 10.07.2012 16:00

Тем не менее, если задать
Код AS3:

URLLoaderDataFormat.BINARY

, то свойство data загрзучика будет содержать ByteArray. Это явно не
Код AS3:

URLLoaderDataFormat.VARIABLES;

Лично я это часто использую, когда гружу зашифрованные файлы, которые флеш плеер сразу распознать не может. Не указывать же мне, что там в качестве данных пришли переменные?

elder_Nosferatu 10.07.2012 16:15

Я чаще гружу обычный текст, так что свойство это не трогаю, но так как я уверен, что должен получать переменные, то, казалось бы, смело могу пользоваться соответствующим форматом. Но даже в случае IOError я не могу получит IOErrorEvent, так как певым делом вылетает упомянутая мной ошибка. Не красиво как-то...

alatar 10.07.2012 16:59

А почему вы решили, что должны получить IOError, если сервер вам возвращает статус 200 и данные в формате XML? Вы пытаетесь переложить проблемы сервера и корявости его API на плечи клиента.

elder_Nosferatu 10.07.2012 17:14

Цитата:

Сообщение от alatar (Сообщение 1088096)
А почему вы решили, что должны получить IOError, если сервер вам возвращает статус 200 и данные в формате XML? Вы пытаетесь переложить проблемы сервера и корявости его API на плечи клиента.

Не совсем. Это два варианта с одинаковым исходом:
- отчет об ошибке серверного скрипта;
- серверный скрипт недоступен (здесь я и должен получить IOError)

Я так понял, что для URLLoader`а любой ответ приемлем, но вот проблема в том, что он сперва пытается сконвертировать ответ согласно значению свойства dataFormat, а потом уже смотрит, что же в нем сказано. Вывод сделал, основываясь на том, что если dataFormat равно URLLoaderDataFormat.TEXT, тогда (если php-скрипт недоступен) я спокойно ловлю IOErrorEvent.

wvxvw 10.07.2012 17:58

Это на самом деле плохая реализация HTTP во Флеше. Данные-то передаются по HTTP, и должны следовать установленым в нем правилам. О том, что данные передаются в формате пара имя-значение должен говорить заголовок content-type application/x-www-form-urlencoded и это никак не зависит от того в каком формате данные послылались, принимать их нужно по факту наличия заголовка.

Но поскольку с этим особо ничего не поделаешь, и очевидно что эти извращения были сделаны by design. Остается вобщем-то выставлять binary и потом парсить самому, но уже наугад, т.как заголовки ответа по какой-то мистической причине плеер не разрешает читать флешке. Ситуация на столько идиотская, что в одно время я даже задумывался о том, чтобы написать человеческую реализацию HTTP используя Socket - но как-то потом не актуально стало.

elder_Nosferatu 10.07.2012 18:07

2wvxvw
Спасибо за ответ! Я ради интереса перелопатил справку, пересмотрел примеры - все думал, что проблема скорее во мне, а не Флеше. Вы меня успокоили :)

alatar 10.07.2012 18:08

Цитата:

Сообщение от wvxvw (Сообщение 1088103)
Ситуация на столько идиотская, что в одно время я даже задумывался о том, чтобы написать человеческую реализацию HTTP используя Socket - но как-то потом не актуально стало.

https://github.com/gabriel/as3httpclient

Krusty 10.07.2012 18:09

Цитата:

Сообщение от wvxvw (Сообщение 1088103)
Но поскольку с этим особо ничего не поделаешь, и очевидно что эти извращения были сделаны by design. Остается вобщем-то выставлять binary и потом парсить самому, но уже наугад, т.как заголовки ответа по какой-то мистической причине плеер не разрешает читать флешке. Ситуация на столько идиотская, что в одно время я даже задумывался о том, чтобы написать человеческую реализацию HTTP используя Socket - но как-то потом не актуально стало.

Так я вот написал, да и не только я, благо несложно. Сокету, оказывается, нужен сокет полиси сервер, то есть просто меняем одно извращение от Адоба на другое.

wvxvw 10.07.2012 20:58

Спасиб, интересная библиотека, надо будет запомнить, жаль автор похоже забросил проект, ну да это такое, мне тоже сейчас ни для чего особо не нужно.

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

Еще есть вариант для заголовков - посылать запросы используя Явасркипт... но тут опять же облом, если бинарные данные обратно отправляют, т.как не передашь их из Яваскрипта особенно.


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

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