PHP, XML, JSON
Зачем использовать XML, JSON
При взаимодействии с сервером из флеш или других приложений, лучше использовать специальные форматы обмена данными.
Часто, начинающие передают множество данных, придумывая свою структуру, отделяя параметры запятыми, точками с запятыми и т.п. Из-за этого приходится обрабатывать ответ в своём приложении, а неотлаженный процесс обработки может вызвать ошибки, например при передаче в самом параметре разделяющего символа.
Логичнее использовать существующие форматы обмена данными XML или JSON.
JSON или XML?
В ActionScript не требуется дополнительных библиотек для работы с XML. В JavaScript можно сразу работать с JSON.
JSON - более компактный формат, но при работе в ActionScript требуется дополнительная библиотека.
Если в вашем flash приложении большое количество обмена информацией с сервером, то использование формата JSON предпочтительнее, даже не смотря на то что требуется дополнительная библиотека.
Если в вашем флеш приложении есть только 1-2 ответа по одному параметру, то можно ограничиться и форматом XML.
Чтобы ваш php скрипт на сервере возвращал данные в нужном формате, нужно просто сделать вывод строки с параметрами.
Например
XML
Код: Выделить всё
echo '<?xml version="1.0" encoding="UTF-8"?><response>'.$message.'</response>';
Код: Выделить всё
echo '{"response":"'.$message.'"}';
В скрипте желательно передать header с форматом. Это поможет обрабатываемому скрипту понять какой формат данных нужно обработать.
Для XML
Код: Выделить всё
header('Content-Type: text/xml; charset=utf-8');
Код: Выделить всё
header('Content-Type: application/json; charset=utf-8');
В случае с XML, данные можно выводить в цикле, используя echo.
C JSON можно поступить так же. Но иногда бывает проще записать данные в массив, а затем просто декодировать их в JSON формат, используя функцию json_encode. Эта функция присутствует в PHP 5.
Передача одного параметра
XML
Код: Выделить всё
<?phpheader('Content-Type: text/xml; charset=utf-8'); $message = 1;echo '<?xml version="1.0" encoding="UTF-8"?><response>'.$message.'</response>'?>
Код: Выделить всё
<?xml version="1.0" encoding="UTF-8"?><response>1</response>
Код: Выделить всё
<?phpheader('Content-Type: application/json; charset=utf-8'); $arr = array('response'=>1);echo json_encode($arr);?>
Код: Выделить всё
{"response":"1"}
Код: Выделить всё
$message = 1;echo '{"response":"'.$message.'"}';
Передача нескольких однотипных параметров
XML
Код: Выделить всё
$arr = array('abc','def','ghi');echo '<?xml version="1.0" encoding="utf-8"?><response list="true">'."\n";while (list($key, $val) = each($arr)) { echo '<item>'.$val.'</item>'."\n";}echo '</response>';
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?><response list="true"> <item>abc</item> <item>def</item> <item>ghi</item></response>
Код: Выделить всё
$arr = array('response'=>array('abc','def','ghi'));echo json_encode($arr);
Код: Выделить всё
{"response":["abc","def","ghi"]}
Передача однотипных параметров с вложенными свойствами
XML
Придется обходить все вложенные массивы. В результате получится довольно большой ответ от сервера, по сравнению с JSON.
Ответ
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?><response list="true"><item><id>1</id><title>флаппс.ру</title><description>Описание Элемента 1</description></item><item><id>2</id><title>Элемент 2</title><description/></item></response>
Код: Выделить всё
$arr = array('response'=>array( array('id'=>1,'title'=>"флаппс.ру",'description'=>"Описание Элемента 1"), array('id'=>2,'title'=>"Элемент 2",'description'=>"") ));echo json_encode($arr);
Код: Выделить всё
{"response":[{"id":1,"title":"\u0444\u043b\u0430\u043f\u043f\u0441.\u0440\u0443","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 1"},{"id":2,"title":"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 2","description":""}]}
Код: Выделить всё
\u0444\u043b\u0430\u043f\u043f\u0441.\u0440\u0443
Стандартная функция json_encode заменяет символы кириллицы.
Скрипт клиента нормально обработает такой ответ и выведет данные в нужном виде. Но это может помешать отладке приложения.
Чтобы скрипт возвратил русские буквы без замены, можно добавить в скрипт функцию json_encode_cyr и вызвать её вместо функции json_encode
Код: Выделить всё
function json_encode_cyr($arr) { $trans = array( '\u0410'=>'А', '\u0411'=>'Б', '\u0412'=>'В', '\u0413'=>'Г', '\u0414'=>'Д', '\u0415'=>'Е', '\u0401'=>'Ё', '\u0416'=>'Ж', '\u0417'=>'З', '\u0418'=>'И', '\u0419'=>'Й', '\u041a'=>'К', '\u041b'=>'Л', '\u041c'=>'М', '\u041d'=>'Н', '\u041e'=>'О', '\u041f'=>'П', '\u0420'=>'Р', '\u0421'=>'С', '\u0422'=>'Т', '\u0423'=>'У', '\u0424'=>'Ф', '\u0425'=>'Х', '\u0426'=>'Ц', '\u0427'=>'Ч', '\u0428'=>'Ш', '\u0429'=>'Щ', '\u042a'=>'Ъ', '\u042b'=>'Ы', '\u042c'=>'Ь', '\u042d'=>'Э', '\u042e'=>'Ю', '\u042f'=>'Я', '\u0430'=>'а', '\u0431'=>'б', '\u0432'=>'в', '\u0433'=>'г', '\u0434'=>'д', '\u0435'=>'е', '\u0451'=>'ё', '\u0436'=>'ж', '\u0437'=>'з', '\u0438'=>'и', '\u0439'=>'й', '\u043a'=>'к', '\u043b'=>'л', '\u043c'=>'м', '\u043d'=>'н', '\u043e'=>'о', '\u043f'=>'п', '\u0440'=>'р', '\u0441'=>'с', '\u0442'=>'т', '\u0443'=>'у', '\u0444'=>'ф', '\u0445'=>'х', '\u0446'=>'ц', '\u0447'=>'ч', '\u0448'=>'ш', '\u0449'=>'щ', '\u044a'=>'ъ', '\u044b'=>'ы', '\u044c'=>'ь', '\u044d'=>'э', '\u044e'=>'ю', '\u044f'=>'я'); return strtr(json_encode($arr),$trans);} echo json_encode_cyr($arr);
Код: Выделить всё
{"response":[{"id":1,"title":"флаппс.ру","description":"Описание Элемента 1"},{"id":2,"title":"Элемент 2","description":""}]}