Во многих играх при создании сайтов в клиент-серверном взаимодействии часто приходится создавать протокол общения между Flash, PHP и javascript. В этой статье я постараюсь описать основные принципы работы этого механизма на примере обмена данными php-flash.
Итак, в процессе создания сайта в начале создадим на стороне Flash-приложения класс посылки-приема данных.
package
{
import com.adobe.serialization.json.JSON;
import flash.display.*;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IEventDispatcher;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.*;
public class WebAPI
{
private var _callback:Function;
private var _online:Boolean=false;
public function WebAPI()
{
}
//############################# EVENTS #################################
private function configureListeners(dispatcher:IEventDispatcher):void
{
dispatcher.addEventListener(Event.OPEN, openHandler);
dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
}
private function openHandler(event:Event):void
{
trace("openHandler: " + event);
}
private function progressHandler(event:ProgressEvent):void
{
trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal);
}
private function securityErrorHandler(event:SecurityErrorEvent):void
{
trace("securityErrorHandler: " + event);
}
private function httpStatusHandler(event:HTTPStatusEvent):void
{
trace("httpStatusHandler: " + event);
}
private function ioErrorHandler(event:IOErrorEvent):void
{
trace("ioErrorHandler: " + event);
}
//############################# CALLBACK #################################
private function completeHandler(event:Event):void
{
var loader:URLLoader = URLLoader(event.target);
if(_callback!=null)
{
var result:Object;
result = JSON.decode(loader.data);
_callback(result);
}
}
//############################# POST DATA #################################
public function load_data(params:Array, URL:String, callback:Function=null):void
{
_callback = callback;
var vhod_var:URLVariables = new URLVariables(); // хранилище переменных для передачи в скрипт
var vhod_req:URLRequest = new URLRequest(URL); // куда идет коннект
vhod_req.method = URLRequestMethod.POST; // метод POST
var vhod_ldr:URLLoader = new URLLoader(); // гейтвейт
configureListeners(vhod_ldr);
// определяем переменные для передачи
for(var p:String in params)
vhod_var[p] = params[p];
vhod_req.data = vhod_var; // записываем все переменные в постовский сендер
vhod_ldr.dataFormat = URLLoaderDataFormat.TEXT; // определяем формат получения данных
try
{
vhod_ldr.load(vhod_req); // передаем переменные в скрипт и получаем результат
}
catch (err:Error)
{
//если неудачно то ошибка
trace(" Сервер не доступен!");
}
}
//############################# UTILS #################################
public function getBaseURL(url:String):String
{
if (url.indexOf("?") == -1)
{
var lastSlashIndex:int = url.lastIndexOf("/");
url = url.substring(0, lastSlashIndex+1);
}
else
{
var indexOfUpitnik:int = url.lastIndexOf("?");
url = url.substring(0, indexOfUpitnik+1);
lastSlashIndex = url.lastIndexOf("/");
url = url.substring(0, lastSlashIndex+1);
}
return url;
}
}
}
Как видно из класса, прием данных будет осуществляться через JSON-формат. Для этого мы подключили JSON-библиотеку для флеша: import com.adobe.serialization.json.JSON;
Пример использования:
Для Flash-проэкта:
- помещаем файл со скриптом в ту же папку, что и флешка.
- пишем код:
var web_api:WebAPI;
web_api=new WebAPI();
url=web_api.getBaseURL(LoaderInfo(this.root.loaderInfo).loaderURL)+”test.php”;
var params:Array=new Array();
params[‘action’]=”get_goods”;
params[‘id’]=123;
params[‘secret’]=”sdfsdfgfe45622bnv34bv”;
web_api.load_data(params, url, getGoods);
function getGoods(loadedData:Object):void
{
for(var p:String in loadedData)
trace(“key=”+p+”value=”+ loadedData[p]);
// DO somethigs next…
}
Для Flex-проэкта web_api.getBaseURL работать не будет. Поэтому выходом из этой ситуации будет передача этого же url посредством flash-vars.
В остальном принцип работы тот же, что описан выше.
Пример простого кода на стороне сервера будет выглядить примерно так:
header('Content-Type: text/html; charset=utf-8');
$test_array=array();
$test_array[‘foo’]=’one’;
$test_array[‘bar’]=’two’;
if(isset($_POST['action']))
{
switch($_POST['action'])
{
case ‘get_goods’: echo json_encode($test_array);break;
case 'right_menu': echo json_encode($right_menu);break;
……………………………………………………
}
}
Примечание: json-формат доступен в php версии не ниже 5.3. Можно конечно же создать свой метод json_encode, что будет применяться, если в php на вашем web-сервере не будет обнаружен свой json_encode-метод.
Точно такой же подход можно использовать и для javascript-взаимодействия. Единственная проблема в этом может быть - преобразование в php ф-ии json_encode русских букв в их utf-8 аналоги.
Если у Вас возникла проблема с русскими символами - читаем дальше :)
1. Добавляем в php-файл функцию вида:
function json_encode_cyr($str) {
$arr_replace_utf = array('u0410', 'u0430','u0411','u0431','u0412','u0432',
'u0413','u0433','u0414','u0434','u0415','u0435','u0401','u0451','u0416',
'u0436','u0417','u0437','u0418','u0438','u0419','u0439','u041a','u043a',
'u041b','u043b','u041c','u043c','u041d','u043d','u041e','u043e','u041f',
'u043f','u0420','u0440','u0421','u0441','u0422','u0442','u0423','u0443',
'u0424','u0444','u0425','u0445','u0426','u0446','u0427','u0447','u0428',
'u0448','u0429','u0449','u042a','u044a','u042d','u044b','u042c','u044c',
'u042d','u044d','u042e','u044e','u042f','u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$str1 = json_encode($str);
$str2 = str_replace($arr_replace_utf,$arr_replace_cyr,$str1);
return $str2;
}
В коде выше заменяем json_encode на json_encode_cyr.
2. Для Flash все должно работать, как описано выше. Объект мы уже имеем. В случаи javascript мы имеем на получении строку, что есть json. Чтобы преобразовать json-строку в объект делаем следующее:
Предположим str - это наша json-строка. Тогда чтобы сделать ее объектом пишем код:
obj = eval( "obj = " + str );
Все.
Тренируемся, если будут вопросы - пишите.