Страница 1 из 2
Как получить ответ от сервера?
Добавлено: 17 фев 2014, 14:01
Agiliter
Недавно начал изучать php и as3. Возник вопрос о связи клиента и сервера.
Клиентом делаю запрос так (использую денвер)
Код: Выделить всё
package { import flash.display.*; import flash.errors.*; import flash.events.*; import flash.net.*; //----------------------------------------------------------------------------------------- public class Main extends Sprite { private var loader:URLLoader; private var request:URLRequest; private var vars:URLVariables; //private var gid:String = '12011990'; private var mess:String = 'Hello!'; //----------------------------------------------------------------------------------------- public function Main() { // создание запроса loader = new URLLoader(); request = new URLRequest('http://FlashTest1.ru/script.php'); request.method = URLRequestMethod.POST; // добавление параметров в запрос vars = new URLVariables(); //vars['gid']= gid; vars['mess']= mess; request.data=vars; loader.load(request); loader.addEventListener(Event.COMPLETE, GOOD_TEST); loader.addEventListener(IOErrorEvent.IO_ERROR, BAD_TEST); trace(vars['mess']); }//----------------------------------------------------------------------------------------- private function GOOD_TEST(e:Event):void { trace("Good! "); }//----------------------------------------------------------------------------------------- private function BAD_TEST(e:IOErrorEvent):void { trace("File not found! Ошибка:" + e); }//----------------------------------------------------------------------------------------- } }
На сервере лежит скрипт
Код: Выделить всё
<?php header('Content-Type: text/xml; charset=utf-8'); // получаем параметры //$param1 = $_POST['gid']; $param2 = $_POST['mess']; $param2 = $param2." world!"; //echo $param2; echo '<?xml version="1.0" encoding="UTF-8"?> <response>'.$param2.'</response>'; ?>
А как дальше передать ответ клиенту? Ну написал я xml-файл через echo и что? Только трейсом выводит
Hello!
Good!
Не вижу толка от эха. Нужно флэшкой как-то ловить? Как?
Re: Как получить ответ от сервера?
Добавлено: 17 фев 2014, 15:04
antibuker
loader.data в GOOD_TEST
Re: Как получить ответ от сервера?
Добавлено: 17 фев 2014, 18:37
Agiliter
antibuker писал(а):loader.data в GOOD_TEST
Я про это как раз читал, и мне мысль пришла это использовать)) Спасибо) А мне xml ловить? Вообще, в каком формате данные выдает эхо? В случае
Код: Выделить всё
echo '<?xml version="1.0" encoding="UTF-8"?> <response>'.$param2.'</response>';
нужно привести data к xml. А можно иначе передать?
Например:
Тогда string что ли?
Re: Как получить ответ от сервера?
Добавлено: 17 фев 2014, 18:52
sasha^
да=) можно и json...
Re: Как получить ответ от сервера?
Добавлено: 02 мар 2014, 10:46
Casperovskii
Agiliter
Лично я выдавал всегда информацию через какой-то делитель (в данном случае через точку с запятой):
Код: Выделить всё
echo $freeEnergy.';'.$paidEnergy.';'.$slowersCount.';'.$musicOn;//код на пхп - просто строка из моего скрипта
В AS:
Код: Выделить всё
private function onEnergyLoadCompleteLitener(e:Event):void { //функция обработки ответа trace(URLLoader(e.target).data); var energyResponse:Array = URLLoader(e.target).data.split(';');//точка с запятой - делитель if (energyResponse[3]==0) { //булева переменная для включенной/выключенной музыки addChild(soundOnButton); gameField.soundOn = false; } else { addChild(soundOffButton); } freeEnergyCount = energyResponse[0]; //количество бесплатной энергии (тратится в первую очередь) paidEnergyCount = energyResponse[1];//кол-во задоначенной энергии (когда первая равно нулю тратится) slowersCount = energyResponse[2]; //кол-во замедлителей. все эти три переменных выводятся на экран ниже for (var k:int = 0; k<5; k++) { removeChild(energyImagesArray[k]); } removeChild(paidEnergyTextField); updateEnergy(); //они выводятся в другой функции - апдейт энерджи }
Надеюсь, поможет. Но xml и json php и AS способны разбирать самостоятельно, вроде как. Но с ними не работал
Re: Как получить ответ от сервера?
Добавлено: 02 мар 2014, 11:05
IndieGD
Работа с JSON что в PHP, что в AS3 проще чем огурец)))
PHP:
Код: Выделить всё
<?php$data = array('energy' => 100, 'gold' => 200);echo json_encode($data);?>
AS:
Код: Выделить всё
private function handler(e:Event):void { var data:Object = JSON.parse(e.target.data); trace(data.energy, data.gold);}
Re: Как получить ответ от сервера?
Добавлено: 16 мар 2014, 14:28
Agiliter
Возникла проблемка.
Начал писать класс для взаимодействия с сервером (AS+php)
Код: Выделить всё
package {//===================================================================================================================== import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.events.*; import flash.net.*; import flash.text.*;//===================================================================================================================== public class MyClientServer extends EventDispatcher { private var path:String = "http://www.flashtest1.ru/"; // Путь к php скриптам private var myLoader:URLLoader; private var myRequest:URLRequest; private var myData:URLVariables; public var result:String = "NO RESULT";//===================================================================================================================== public function MyClientServer() { trace("Запущен класс MyClientServer"); }//===================================================================================================================== public function MyPost(scriptName:String = "script.php"):void { var fullPath:String = path + scriptName; myLoader = new URLLoader(); myRequest = new URLRequest(fullPath); myData = new URLVariables(); myData.gid = "Hello "; myData.mess = "world"; myRequest.data = myData; myRequest.method = URLRequestMethod.POST; myLoader.dataFormat = URLLoaderDataFormat.TEXT; myLoader.addEventListener(Event.COMPLETE, onMyPost); myLoader.load(myRequest); //trace(result); }//===================================================================================================================== public function onMyPost(event:Event):void { result = myLoader.data; trace("DATA: " + myLoader.data); trace("result: " + result); trace("str: " + getResult()); }//===================================================================================================================== public function getResult():String { //trace(result); return result; }//===================================================================================================================== } }
Пробую вызвать в другом классе, используя функцию:
Код: Выделить всё
public function newClientServer(str:String):void { myCliSer = new MyClientServer(); myCliSer.MyPost(str); var str:String = myCliSer.getResult(); trace("Результат запроса: " + str); }
Сам скрипт:
Код: Выделить всё
<?php //header('Content-Type: text/xml; charset=utf-8'); // получаем параметры $param1 = $_POST['first']; $param2 = $_POST['second']; echo 'Say: '.$param1.' '.$param2.' ' ; ?>
Трейсами выдает:
Результат запроса: NO RESULT
DATA: Say: Hello world
result: Say: Hello world
str: Say: Hello world
Почему Результат запроса: NO RESULT? result же изменяется.
Где я накосячил и что не учел?
Re: Как получить ответ от сервера?
Добавлено: 16 мар 2014, 17:52
alexandr_ratush
Проблема в том, что отправка данных на сервер, и получение ответа имеет асинхронную природу. То есть код выполняется не подряд как вы написали. Для этого флеш-плееру пришлось бы останавливать воспроизведение, пока не придут данные от сервера.
Вам нужно дождаться получения данных в методе
onMyPost, и тут к примеру диспатчить событие:
Код: Выделить всё
public function onMyPost(event:Event):void { result = myLoader.data; trace("DATA: " + myLoader.data); trace("result: " + result); trace("str: " + getResult()); // Отправляем событие в поток, что данные пришли и изменились dispatchEvent(new Event(Event.COMPLETE)); }
подписаться на событие
и обработать его:
Код: Выделить всё
myCliSer.addEventListener(Event.COMPLETE, completeLoadHandler); private function completeLoadHandler(e:Event):void {var str:String = myCliSer.getResult();trace("Результат запроса: " + str);}
Re: Как получить ответ от сервера?
Добавлено: 16 мар 2014, 20:57
Agiliter
Большое спасибо) Выручили
Re: Как получить ответ от сервера?
Добавлено: 31 мар 2014, 19:09
Agiliter
alexandr_ratush писал(а):
Сообщение alexandr_ratush » 16 мар 2014, 17:52
Проблема в том, что отправка данных на сервер, и получение ответа имеет асинхронную природу. То есть код выполняется не подряд как вы написали.
Из-за этого возникла еще одна проблемка) По-крайней мере, думаю, что из-за этого. У меня есть класс MyWindow, который отвечает за создание окон. По сути своей каждое окно, кроме mainWindow, это графические контейнеры - набор прямоугольников, текста и кнопок. В mainWindow же есть еще и фоновое изображение, которое грузится с сервера.
Код: Выделить всё
myWindow = new MyWindow(); myWindow.mainWindow(); myWindow.shopWindow(); myWindow.messageWindow(); addChild(myWindow);
В итоге получается, что сначала рисуются все окошки, потом фоновый рисунок mainWindow вставляется поверх прямоугольников, но не поверх текста и кнопок.
Хрень короче.