Как получить ответ от сервера?

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Как получить ответ от сервера?

Сообщение 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!
Не вижу толка от эха. Нужно флэшкой как-то ловить? Как?
antibuker
Сообщения: 12
Зарегистрирован: 01 авг 2013, 14:09

Re: Как получить ответ от сервера?

Сообщение antibuker »

loader.data в GOOD_TEST
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Как получить ответ от сервера?

Сообщение Agiliter »

antibuker писал(а):loader.data в GOOD_TEST
Я про это как раз читал, и мне мысль пришла это использовать)) Спасибо) А мне xml ловить? Вообще, в каком формате данные выдает эхо? В случае

Код: Выделить всё

echo '<?xml version="1.0" encoding="UTF-8"?>   <response>'.$param2.'</response>';
нужно привести data к xml. А можно иначе передать?
Например:

Код: Выделить всё

echo $param2;
Тогда string что ли?
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Как получить ответ от сервера?

Сообщение sasha^ »

да=) можно и json...
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Как получить ответ от сервера?

Сообщение 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 способны разбирать самостоятельно, вроде как. Но с ними не работал
IndieGD
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20

Re: Как получить ответ от сервера?

Сообщение 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);}
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Как получить ответ от сервера?

Сообщение 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 же изменяется.
Где я накосячил и что не учел?
Аватара пользователя
alexandr_ratush
Сообщения: 94
Зарегистрирован: 05 мар 2014, 21:47

Re: Как получить ответ от сервера?

Сообщение alexandr_ratush »

Проблема в том, что отправка данных на сервер, и получение ответа имеет асинхронную природу. То есть код выполняется не подряд как вы написали. Для этого флеш-плееру пришлось бы останавливать воспроизведение, пока не придут данные от сервера. :D
Вам нужно дождаться получения данных в методе 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));        }
подписаться на событие

Код: Выделить всё

Event.COMPLETE
и обработать его:

Код: Выделить всё

myCliSer.addEventListener(Event.COMPLETE, completeLoadHandler); private function completeLoadHandler(e:Event):void {var str:String = myCliSer.getResult();trace("Результат запроса: " + str);}
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Как получить ответ от сервера?

Сообщение Agiliter »

Большое спасибо) Выручили :)
Agiliter
Сообщения: 112
Зарегистрирован: 01 фев 2014, 13:46

Re: Как получить ответ от сервера?

Сообщение Agiliter »

alexandr_ratush писал(а): Сообщение alexandr_ratush » 16 мар 2014, 17:52
Проблема в том, что отправка данных на сервер, и получение ответа имеет асинхронную природу. То есть код выполняется не подряд как вы написали.
Из-за этого возникла еще одна проблемка) По-крайней мере, думаю, что из-за этого. У меня есть класс MyWindow, который отвечает за создание окон. По сути своей каждое окно, кроме mainWindow, это графические контейнеры - набор прямоугольников, текста и кнопок. В mainWindow же есть еще и фоновое изображение, которое грузится с сервера.

Код: Выделить всё

                         myWindow = new MyWindow();            myWindow.mainWindow();            myWindow.shopWindow();            myWindow.messageWindow();            addChild(myWindow);
В итоге получается, что сначала рисуются все окошки, потом фоновый рисунок mainWindow вставляется поверх прямоугольников, но не поверх текста и кнопок. :? Хрень короче.
Ответить