Информация к новости
  • Просмотров: 1210
  • Автор: sulicompany
  • Дата: 15-07-2012, 22:22
 (голосов: 0)
15-07-2012, 22:22

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

Категория: Программирование » VK (Вконтакте)


Зачем использовать XML, JSON

При взаимодействии с сервером из флеш или других приложений, лучше использовать специальные форматы обмена данными.

Часто, начинающие передают множество данных, придумывая свою структуру, отделяя параметры запятыми, точками с зяпятыми и т.п. Из-за этого приходится обрабатывать ответ в своём приложении, а неотлаженный процесс обработки может вызвать ошибки, например при передаче в самом параметре разделяющего символа.
Логичнее использовать существующие форматы обмена данными XML или JSON.


JSON или XML?

В ActionScript не требуется дополнительных библиотек для работы с XML. В javascript можно сразу работать с JSON. 

JSON - более компактный формат, но при работе в ActionScript требуется дополнительная библиотека.
Если в вашем flash приложении большое количество обмена информацией с сервером, то использование формата JSON предпочтительнее, даже не смотря на то что требуется дополнительная библиотека.
Если в вашем флеш приложении есть только 1-2 ответа по одному параметру, то можно ограничиться и форматом XML. 



Чтобы ваш php скрипт на сервере возвращал данные в нужном формате, нужно просто сделать вывод строки с параметрами.

Например
XML
  1.  '<?xml version="1.0" encoding="UTF-8"?>
  2. <response>'.$message.'</response>';

JSON
  1.  '{"response":"'.$message.'"}';

Файл скрипта должен быть в кодировке UTF-8 без BOM, тогда у вас будет меньше проблем с кодировкой при выводе данных в вашем приложении.
В скрипте желательно передать header с форматом. Это поможет обрабатываемому скрипту понять какой формат данных нужно обработать.

Для XML
  1. ('Content-Type: text/xml; charset=utf-8');


Для JSON
  1. ('Content-Type: application/json; charset=utf-8');



В случае с XML, данные можно выводить в цикле, используя echo.
C JSON можно поступить так же. Но иногда бывает проще записать данные в массив, а затем просто декодировать их в JSON формат, используя функцию json_encode. Эта функция присутствует в PHP 5.


Передача одного параметра

XML
  1. <?php
  2. ('Content-Type: text/xml; charset=utf-8');
  3.  
  4. $message = 1;
  5.  '<?xml version="1.0" encoding="UTF-8"?>
  6. <response>'.$message.'</response>'
  7. ?>

Ответ
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <response>1</response>


JSON
  1. <?php
  2. ('Content-Type: application/json; charset=utf-8');
  3.  
  4. $arr = array('response'=>1);
  5.  ($arr);
  6. ?>

Ответ
 |  | 
  1. {"response":"1"}


Для передачи одного параметра можно сделать и так
  1. $message = 1;
  2.  '{"response":"'.$message.'"}';

и получить такой же ответ.


Передача нескольких однотипных параметров

XML
  1. $arr = array('abc','def','ghi');
  2. echo '<?xml version="1.0" encoding="utf-8"?>
  3. <response list="true">'."\n";
  4. while (list($key, $val) = each($arr)) {
  5.     echo '<item>'.$val.'</item>'."\n";
  6. }
  7. echo '</response>';

Ответ
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <response list="true">
  3.  <item>abc</item>
  4.  <item>def</item>
  5.  <item>ghi</item>
  6. </response>


JSON
  1. $arr = array('response'=>array('abc','def','ghi'));
  2.  ($arr);

Ответ
  1. {"response":["abc","def","ghi"]}



Передача однотипных параметров с вложенными свойствами

XML
Придется обходить все вложенные массивы. В результате получится довольно большой ответ от сервера, по сравнению с JSON.
Ответ
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <response list="true">
  3. <item>
  4. <id>1</id>
  5. <title>флаппс.ру</title>
  6. <description>Описание Элемента 1</description>
  7. </item>
  8. <item>
  9. <id>2</id>
  10. <title>Элемент 2</title>
  11. <description/>
  12. </item>
  13. </response>


JSON
  1. $arr = array('response'=>array(
  2.                             array('id'=>1,'title'=>"флаппс.ру",'description'=>"Описание Элемента 1"),
  3.                             array('id'=>2,'title'=>"Элемент 2",'description'=>"")
  4.                             ));
  5.  ($arr);

Ответ
  1. {"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":""}]}

Тут можно наткнутся на такую проблему, что русские буквы будут записаны в таком формате
  1. \u0444\u043b\u0430\u043f\u043f\u0441.\u0440\u0443

вместо простого флаппс.ру

Стандартная функция json_encode заменяет символы кириллицы.
Скрипт клиента нормально обработает такой ответ и выведет данные в нужном виде. Но это может помешать отладке приложения.

Чтобы скрипт возвратил русские буквы без замены, можно добавить в скрипт функцию json_encode_cyr и вызвать её вместо функции json_encode
  1. function json_encode_cyr($arr) {
  2.     $trans = array(
  3.     '\u0410'=>'А''\u0411'=>'Б''\u0412'=>'В''\u0413'=>'Г''\u0414'=>'Д','\u0415'=>'Е',
  4.     '\u0401'=>'Ё''\u0416'=>'Ж''\u0417'=>'З''\u0418'=>'И''\u0419'=>'Й','\u041a'=>'К',
  5.     '\u041b'=>'Л''\u041c'=>'М''\u041d'=>'Н''\u041e'=>'О''\u041f'=>'П','\u0420'=>'Р',
  6.     '\u0421'=>'С''\u0422'=>'Т''\u0423'=>'У''\u0424'=>'Ф''\u0425'=>'Х','\u0426'=>'Ц',
  7.     '\u0427'=>'Ч''\u0428'=>'Ш''\u0429'=>'Щ''\u042a'=>'Ъ''\u042b'=>'Ы','\u042c'=>'Ь',
  8.     '\u042d'=>'Э''\u042e'=>'Ю''\u042f'=>'Я',
  9.     '\u0430'=>'а''\u0431'=>'б''\u0432'=>'в''\u0433'=>'г''\u0434'=>'д','\u0435'=>'е',
  10.     '\u0451'=>'ё''\u0436'=>'ж''\u0437'=>'з''\u0438'=>'и''\u0439'=>'й','\u043a'=>'к',
  11.     '\u043b'=>'л''\u043c'=>'м''\u043d'=>'н''\u043e'=>'о''\u043f'=>'п','\u0440'=>'р',
  12.     '\u0441'=>'с''\u0442'=>'т''\u0443'=>'у''\u0444'=>'ф''\u0445'=>'х','\u0446'=>'ц',
  13.     '\u0447'=>'ч''\u0448'=>'ш''\u0449'=>'щ''\u044a'=>'ъ''\u044b'=>'ы','\u044c'=>'ь',
  14.     '\u044d'=>'э''\u044e'=>'ю''\u044f'=>'я');
  15.      (($arr),$trans);
  16. }
  17.  
  18.  json_encode_cyr($arr);

Ответ
  1. {"response":[{"id":1,"title":"флаппс.ру","description":"Описание Элемента 1"},
  2. {"id":2,"title":"Элемент 2","description":""}]}