Вход

Просмотр полной версии : Проблема - запрос не доходит до сервера


pall92
26.03.2013, 07:10
Здравствуйте, я постепенно вникаю в совместную работу флеш и php. и столкнулся с проблемой:

У меня на хостинге лежит фаил stat.php, отвечающий за получение и обработку запроса из флеш-клиента и обюновление базы данных. лежит он, соответсвенно в папке /my_Server.ru/html. (как видимо и должен?))

чтобы тестить скрипт я пользовался строкой - $p = count($_POST) > 0 ? $_POST : $_GET;(как мне когда-то тут посоветовали)

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

После тестов, я начал работать над отправкой запроса из флеш, после долгих проверок корректности(по учебниками и оф мануалам) получилось вот что:


function ScoreUpdate(score:int):void
{
// создание запроса

var stat_loader:URLLoader = new URLLoader();
var stat_request:URLRequest=new URLRequest();
stat_request.url = "http://my_Server/stat.php";
stat_request.method=URLRequestMethod.POST;
// добавление параметров в запрос
var stat_vars:URLVariables = new URLVariables();
stat_vars['viewer_id']= 3;
stat_vars['my_score']= 0;
stat_request.data=stat_vars;
// выполнение запроса
stat_loader.dataFormat = URLLoaderDataFormat.VARIABLES;
try
{
stat_loader.load(stat_request);
stat_loader.addEventListener(Event.COMPLETE, StatCompleteHandler);
//this.log_tx.appendText("запрос прошел успешно \n");
}
catch (er:Error)
{
this.log_tx.appendText(er.message);
}
}

function StatCompleteHandler(event:Event):void
{
this.log_tx.appendText(event.target.data.toString());
this.log_tx.appendText("fuck");
}


новакя строка в базе данных не создается
никаких ошибок код не выдает,
как и не "получает" событие COMPLETE лоадера.
адресс запроса проверял - верный.
фаил crossdomain.xml написал. писал даже чтоб наверняка -

<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>



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

caseyryan
26.03.2013, 08:07
Тут логика слегка хромает. Слушатель COMPLETE нужно всегда добавлять перед тем, как вызывается метод load. Конечно проблема здесь явно не в этом, так как добавится он все равно быстрее, чем запрос "сходит" до сервера, но тем не менее.

А проблема здесь скорее всего в неправильном пути к скрипту. Написано:

лежит он, соответственно в папке /my_Server.ru/html

Значит и вызывать нужно не "http://my_Server/stat.php", а "http://my_Server/html/stat.php"
логично?
А чтобы наверняка узнавать нашел флеш плеер этот адрес или нет, загрузчик нужно подписать еще и на
IOErrorEvent.IO_ERROR, ну и на SecurityErrorEvent.SECURITY_ERROR до кучи.

(как видимо и должен?)
Какой сервер используется? Могу предположить, что денвер, как наиболее популярный.
Так вот, чтобы скрипт работал в денвере, он должен находиться в {DENWER_DIR}\home\адрес_сайта\www\а_тут_может_быть_скрипт.php
При создании новой директории сайта, денвер обязательно нужно перезапустить, чтобы он обновил файл hosts (ну и возможно какие-то внутренние настройки, хотя на этот счет не уверен)

Если используется apache2, то там вообще он может где угодно лежать, главное правильно создать описание расположения в директории sites-available и создать ссылку в sites-enabled


п.с. Не надо привыкать писать такие корявые названия. Пишите по конвенциям.
не нужно делить составные части переменных андерскором. В АС3 используется верблюжий регистр (http://ru.wikipedia.org/wiki/CamelCase) при этом первая буква в названии свойств всегда меленькая. Исключения составляют названия констант.
То есть вместо этого stat_vars, нужно писать statVars.
А названия методов всегда пишутся с маленькой буквы.

pall92
26.03.2013, 08:48
- я собственно приставал со своими нубскими вопросами к тех-поддержке моего хостинга - hoster.ru.
где мне и сказали создать соответсвующие папки и туда кидать мой скрипт. после чего все действительно заработало.. ну как все - я имею ввиду get-запросы стали доходить до срипта.

я и стал составлять post запрос из приложения по аналогии.
вот.

- есть еще одна вещь в панели управления на хостинге, есть влкадка - ftp-пользователи, куда собственно и нужно заходить чтобы загружать фаилы. так вот - там есть небольшая приписка без коментариев:
ftp хост - ftp-50035.srv.hoster.ru

может быть нужно обращаться к нему?
(до создания папки одноименный с доменом php-скрипт находился в корневой папке - тогда я уже пробовал обращаться по указаному адресу, но так не работало вообще ничего)

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


- сервер, апач... кажется.


-"Значит и вызывать нужно не "http://my_Server/stat.php", а "http://my_Server/html/stat.php""
но гет-запросы же доходили - первым способом О.о. или для post и get запросов действую разные правила?

- за советы спасибо. побегу пробовать)

Добавлено через 45 минут
Что ж, я попробовал, что вы советовали.. вы итоге всплыла ошибка 2048
text=Error #2048: Нарушение изолированной среды

собственно, поняв что это как-то связано с crossdomain я начал его проверять, но ошибок вроде нет. но есть вопросы.

для начала собственно его текущий вариант

<cross-domain-policy>
<allow-access-from domain="*.vkontakte.ru"/>
<allow-access-from domain="*.vk.com"/>
<allow-access-from domain="*.userapi.com"/>
</cross-domain-policy>

ну да.. приложение соответсвенно - находится на сервере вконтакте.


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

и еще, возможно глупость но... ведь кроссдомаин можно создавать просто в текстовом фаиле и потом просто заменить .txt на .xml?

вообщем - в чем может быть дело??

caseyryan
26.03.2013, 13:41
и еще, возможно глупость но... ведь кроссдомаин можно создавать просто в текстовом фаиле и потом просто заменить .txt на .xml?
Да, но надо учитывать то, что он должен быть в кодировке utf8.
или для post и get запросов действую разные правила?
Есть ограничения по длине запроса, но фактически, если укладывается в гет, то в пост по-любому уложится. Вот наоборот могут быть проблемы.

Вообще. Зачем этот хостинг? Сначала лучше на локалке откатать все, а уже потом с хостингом заморачиваться

pall92
26.03.2013, 21:36
[QUOTE=caseyryan;1126861]Да, но надо учитывать то, что он должен быть в кодировке utf8.
[/QUOT

как это проверить?

belyjj
26.03.2013, 23:26
Notepad++ думаю поможет.

pall92
29.03.2013, 22:49
нет.. ничего не помогает!

вот нашел описание ошибки-


securityError

Dispatched if a call to URLLoader.load() attempts to load data from a server outside the security sandbox


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

помогите пожалуйста, уже неделю бьюсь, гугл не помогает(

maxkar
29.03.2013, 23:35
Дайте ссылку на ваш домен, что ли. Посмотрю, как выглядит crossomain.xml в реальной жизни. Или домены неверные (контакт их менять любит, а я не знаю, какая версия вашего файла сейчас лежит), или content-type неверный, или crossdomain.xml лежит по неверному адресу.

pall92
30.03.2013, 09:11
Я писал выше- я ставил в кросс домаин - разрешить любые домены, я проверил - он в нужной кодировке. что касается расположения, то оно тоже верное, так как при get-запросах все работало как надо, а значит crossdomain читался.
проблема видимо на стороне приложения

Добавлено через 7 минут
ссылка(не очень понял зачем но окей) - http://dobavlialka.ru

caseyryan
30.03.2013, 09:22
ссылка(не очень понял зачем но окей)
Затем, чтобы поспотреть файл междоменной политики.
Он там вот такой:

<cross-domain-policy>
<allow-access-from domain="*.vkontakte.ru"/>
<allow-access-from domain="*.vk.com"/>
<allow-access-from domain="*.userapi.com"/>
<allow-access-from domain="94.19.66.177.pool.sknt.ru"/>
</cross-domain-policy>

Естественно ничего работать не будет. Не все используемые домены прописаны.
У меня на сервере вот такой:

<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only"/>
<allow-http-request-headers-from domain="vk.com" headers="*"/>
<allow-http-request-headers-from domain="*.vk.com" headers="*"/>
<allow-http-request-headers-from domain="vkontakte.ru" headers="*"/>
<allow-http-request-headers-from domain="*.vkontakte.ru" headers="*"/>
<allow-http-request-headers-from domain="*.userapi.com" headers="*"/>
<allow-http-request-headers-from domain="userapi.com" headers="*"/>
<allow-http-request-headers-from domain="vk.me" headers="*"/>
<allow-http-request-headers-from domain="*.vk.me" headers="*"/>
<allow-http-request-headers-from domain="odnoklassniki.ru" headers="*"/>
<allow-http-request-headers-from domain="*.odnoklassniki.ru" headers="*"/>
<allow-http-request-headers-from domain="mydomain.com" headers="*"/>
<allow-access-from domain="vk.com" to-ports="80, 9991"/>
<allow-access-from domain="*.vk.com" to-ports="80, 9991"/>
<allow-access-from domain="vkontakte.ru" to-ports="80, 9991"/>
<allow-access-from domain="*.vkontakte.ru" to-ports="80, 9991"/>
<allow-access-from domain="mydomain.com" to-ports="80, 9991"/>
<allow-access-from domain="*.userapi.com" to-ports="80, 9991"/>
<allow-access-from domain="userapi.com" to-ports="80, 9991"/>
<allow-access-from domain="vk.me" to-ports="80, 9991"/>
<allow-access-from domain="*.vk.me" to-ports="80, 9991"/>
<allow-access-from domain="odnoklassniki.ru" to-ports="80, 9991"/>
<allow-access-from domain="*.odnoklassniki.ru" to-ports="80, 9991"/>
</cross-domain-policy>


только вместо mydomain.com айпишник моего сервера

pall92
30.03.2013, 09:37
вконтакте нашел где-то на форуме, что да, нужно "прописывать домен для приложения". что это вообще и как делается? первый раз слышу

Добавлено через 1 минуту
ох спасибо большое будем пробовать...

Добавлено через 7 минут
вопрос - в каком смысле "mydomain.com айпишник моего сервера" - всмысле айпи откуда можно тестить сервер и т.п.? или что?

Добавлено через 13 минут
нет. ничего не изменилость. ошибка 2048 как и была(

caseyryan
30.03.2013, 09:54
вопрос - в каком смысле "mydomain.com айпишник моего сервера" - всмысле айпи откуда можно тестить сервер и т.п.? или что?
Нет, это айпи сервера на котором у меня находится и сам кроссдоменник и сервер приложения

pall92
30.03.2013, 09:57
ошибка появляется даже при -
<allow-access-from domain="*" secure="false" />

Добавлено через 1 минуту
Нет, это айпи сервера на котором у меня находится и сам кроссдоменник и сервер приложения

это как так? это же строчка самого кросс домаина... он что должен еще сам себя разрешить?? о.О ничего не понимаю

caseyryan
30.03.2013, 10:02
это как так? это же строчка самого кросс домаина... он что должен еще сам себя разрешить?? о.О ничего не понимаю
Да почему самого-то?
Сам он в этом случае лежит по такому адресу:
mydomain.com/crossdoamin.xml

а на домене висит сервер, который прослушивает соединения на 80 и 9991 портах

pall92
30.03.2013, 10:05
вот еще нашел -
Security.loadPolicyFile("https://domain/crossdomain.xml");
что это такое?

Добавлено через 1 минуту
Да почему самого-то?
Сам он в этом случае лежит по такому адресу:
mydomain.com/crossdoamin.xml

а на домене висит сервер, который прослушивает соединения на 80 и 9991 портах

кажется понял, думал что это разрешено по-умолчанию

Добавлено через 8 минут
по описанию, этого объекта выходит так что нужно им пользоваться всегда, но при этом я ег никогда раньше в примерах и мануалах невидел


Метод
allowDomain(... domains):void

[статические] Позволяет SWF-файлам в указанных доменах обращаться к объектам и переменным в SWF-файле, содержащем вызов allowDomain().

allowInsecureDomain(... domains):void
[статические] Позволяет SWF- и HTML-файлам в определенных доменах обращаться к объектам и переменным в вызывающем SWF-файле, размещенном на сервере с использованием протокола HTTPS.
loadPolicyFile(url:String):void
[статические] Поиск файла политик в каталоге, заданном параметром url.


showSettings(panel:String = "default"):void

[статические] Отображает панель параметров безопасности в проигрывателе Flash Player.

maxkar
30.03.2013, 23:35
crossdomain вроде нормальный. content-type тоже верный. Нужно брать сниффер и смотреть, какие запросы ходят. Либо httpfox, либо charles (это прокси). Может, какие-нибудь банальные опечатчки закрались в POST-запрос. Или adobe какие-то коды ошибок неправильно интерпретирует (хотя не встречал, но я и по списку кодов ошибок не тестировал). А может, вы тестируете локально и случайно allow-network-access переклюичили (я не знаю, изменится там код ошибки или нет).

Security.loadPolicyFile не нужен, для запросов он должен грузиться сам. Смысл добавить имеет только если по сниферу запросы не ходят. Но запросы должны ходить.

Так что попробуйте на запросы посмотреть. Или публичную флешку сделайте и выложите, на которой другие смогут посмотреть (пусть на ваш сайт какой-нибудь простой запрос отправляет). Ничего серьезного делать не нужно. Пусть просто запрос отправляет на определенный адрес, вовзращает что-нибудь константное даже. Потому что очевидных ошибок я не вижу. Нужно все подробно проверять, с маленького примера.

pall92
31.03.2013, 01:34
Всем большое спасибо, кажется последняя версия кроссдомэина, которую мне посоветовали- помогла) просто не сразу, видимо сервер обновляется периодически)

последний вопрос - событие Event.COMPLETE - при корректной работе должно всегда происходить? а то у меня не ловится оно

caseyryan
31.03.2013, 13:26
при корректной работе должно всегда происходить? а то у меня не ловится оно
По идее да.

pall92
02.04.2013, 13:12
Ох и не хотел я так часто спрашивать, но все таки не могу сам разобраться... Выше я уже писал собственно свой код, теперь после исправления ошибки, я ловлю ответ - он приходит, но в виде пустой строчки - "".

С чем это может быть связано???

все что пришло мне в голову это менять тип лоадер-дата с variebles на text, но вообщем это не помогло - результат тот же. При тесте через бразуер - все по прежнему работает правильно - и echo - выводит все что нужно

если нужно создать для этого новое обсуждение, скажите - создам)

caseyryan
02.04.2013, 15:48
По идее там вообще не строка приходит, а URLVariables
А каким образом проверяется то, что пришло?

pall92
03.04.2013, 10:36
событие complete. собственно - оно ловится
выглядит это все дело примерно так -

function loadComplete(event)
{
tex.appendText("ok");
tex.appendText(event.data);
tex.appendText("ok");
}

(код накарябал тут, не копируя, код не под рукой)

в итоге в текстовом окошке появляются три новых строчки - ок, пустая и еще раз ок. О.о

echo в php-скрипте прописан один раз и там я подставля все что только можно, от "myvar=1" до 'myvar='.$myvar...

парметр TEXT место variebles я уже потом поменял, использую метод научного тыка.... =(