Передача данных от сервера клиенту (XML, JSON)

Уроки по PHP, Javascript и т.п.
Ответить
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Передача данных от сервера клиенту (XML, JSON)

Сообщение Александр »

Передача данных от сервера клиенту (XML, JSON)
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>';
JSON

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

echo '{"response":"'.$message.'"}';
Файл скрипта должен быть в кодировке UTF-8 без BOM, тогда у вас будет меньше проблем с кодировкой при выводе данных в вашем приложении.
В скрипте желательно передать header с форматом. Это поможет обрабатываемому скрипту понять какой формат данных нужно обработать.

Для XML

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

header('Content-Type: text/xml; charset=utf-8');
Для JSON

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

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>
JSON

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

<?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>
JSON

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

$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>
JSON

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

$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":""}]}
Happy
Сообщения: 20
Зарегистрирован: 19 ноя 2011, 23:14

Re: Передача данных от сервера клиенту (XML, JSON)

Сообщение Happy »

Я передаю данные из базы данных в приложение методом POST через echo.
Например,

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

echo $sql_data['uid'].' - '.$sql_data['visits'].'<br />';
В приложении могу вывести их в текстовое поле.
Например,

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

result_tf.text=loader.data;
Подскажите как, например, uid в переменную засунуть?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Передача данных от сервера клиенту (XML, JSON)

Сообщение Александр »

Happy
Первое сообщение темы прочитай. Используй JSON.
Потом читай Работа с JSON в ActionScript 3.0
Если не хочешь использовать XML и JSON, то как твой вопрос относится к теме урока? Тогда сам парси свою строку, которую передаёшь.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Передача данных от сервера клиенту (XML, JSON)

Сообщение XELAD »

Долго и упорно пытаюсь заставить работать JSON в XML. Некоторые колонки в БД содержат записи в JSON, и там есть кавычки, причём двойные. Если такую запись вывести в качестве значения одного из поля в xml, то xml разваливается...
Подскажите, может есть функция преобразования JSON во что-то такое, что может быть впихнуто в XML, а уже потом во flash'е без бубна понято? Или же закодирование двойных кавычек при выводе из базы?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Передача данных от сервера клиенту (XML, JSON)

Сообщение Александр »

XELAD
addslashes не помогает?
Смысл использовать xml и json одновременно?
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Передача данных от сервера клиенту (XML, JSON)

Сообщение XELAD »

Александр
Да без меня тут накодили некоторые. Переписал всё на JSON. Если в JSON попадается значение в виде JSON, то считывается как string во flash. И тогда я её переделываю в array. Думал, что именно в "JSON в JSON" будут проблемы, parse начнёт переделывать и то, что является значением, и будет мешанина. Но всё было хорошо.
Ответить