NodeJS. Як надіслати дані у форматі JSON. Надіслати дані JSON з Javascript на PHP

JSON (JavaScript Object Notation) – формат для обміну даними у текстовому вигляді. Що дозволяє передавати складні структури даних у серіалізованому вигляді. Цей формат передачі даних став настільки популярним, що вже в ядро ​​PHP, починаючи з версії 5.2.0, були додані функції обробки даних у цьому форматі. А це означає, що немає потреби в підключенні додаткових розширень. Формат даних JSON добре зрозумілий для людини. Крім того даний типобміну даними широко використовується між різними сервісами API. А при коректній розробці алгоритмів для обміну інформацією можна отримати дуже високий приріст швидкості ніж, наприклад, при роботі з даними у форматі XML.

Надсилання даних

Надіслати дані в форматі JSONможна двома способами: сформувати GET або POST запитіз закодованими даними розташованими в GET або POST змінноїабо помістити дані в тіло документа. Насправді зазвичай використовується другий варіант.

Для здійснення відправки даних необхідні нижчеперелічені функції:

  • string json_encode (mixed value [, int options = 0])

    Як параметр value вказуються дані, які потрібно закодувати. Підтримується будь-який тип крім типу resource. Параметр options містить бітову маску з можливих наданих значень (див. таблицю з наданими константами JSON).

  • resource stream_context_create(])

    Ця функція призначена для створення та повернення контексту потоку з опціями вказаними у параметрі options. Необов'язковий параметр options повинен мати тип асоціативного масиву. Спочатку він порожній. Другий необов'язковий параметр params також має бути асоціативним масивом у форматі $data['ім'я'] = значення.

  • string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen ]]]]])

    Використання цієї функції дозволяє отримати вміст файлу у вигляді рядка. Параметр filename це ім'я файлу, що зчитується. У параметрі use_include_path починаючи з версії PHP 5 можна використовувати константу FILE_USE_INCLUDE_PATHдля пошуку файлу у include path. Параметр context - це ресурс контексту, створений за допомогою функції stream_context_create(). У разі невдалої спроби відкриття файлу буде повернено значення false. Параметр offset містить усунення з якого почнеться читання даних. У параметрі maxlen вказується розмір даних, що одержуються.

    Примітка: Зміщення не вказується під час роботи з віддаленими потоками.

Нижче наведено приклад відправлення даних у форматі JSON:

// Дані для відправки $request = array("StartDate" => "2013-10-10", "EndDate" => "2013-10-10", "IDS" => array(1,2,3,4 ,5,6,7)); // Вказівка ​​опцій для контексту потоку $options = array ("http" => array ("method" => "POST", "header" => "Content-Type: application/json; charset=utf-8\r\ n", "content" => json_encode($request))); // Створення контексту потоку $context = stream_context_create($options); // Відправлення даних та отримання результату echo file_get_contents("http://test.ru/json.php", 0, $context);

Тут використовується імпровізована структура даних, що складається з початкової та кінцевої дати, а також масиву номерів деяких умовних записів. Зверніть увагу на те, що в заголовку запиту Content-Typeвказується тип “application/json”.

Отримання даних

Для того щоб отримати передані дані вищеописаним способомпотрібно зробити читання даних із потоку введення “ php://input”.

Функції, що використовуються для прийняття даних:

  • mixed json_decode (string json [, bool assoc = false [, int depth = 512 [, int options = 0]]]))

    Ця функція декодує рядок у форматі JSON. У параметрі json вказується рядок декодування. Параметр assoc відповідає за те, чи будуть дані, що повертаються, перетворені в асоціативний масив. Якщо така необхідність є, необхідно вказати ролі значення цього параметра true. Параметр depth вказує на глибину рекурсії. І останній четвертий параметр options містить бітову маску опцій декодування. На сьогоднішній день підтримується тільки JSON_BIGINT_AS_STRING(за замовчуванням великі цілі числа наводяться до числа з плаваючою комою (float))

  • resource fopen (string filename , string mode [, bool use_include_path [, resource context ]])

    Відкриває файл та повертає його дескриптор. Параметр filename це іменований ресурс, який вказує на файл. У режимі mode вказується тип доступу до файлу (див. таблицю зі списком можливих режимівдля fopen()). Далі йдуть два необов'язкові параметри: use_include_path і context . При установці параметра use_include_path на значення trueабо 1 і за умови, що як іменований ресурс заданий відносний шлях, буде здійснено пошук файлу, що відкривається, у списку директорій, що використовується функціями includeі require. Насправді цей параметр практично не використовується. Параметр context використовується для визначення контексту ресурсу.

  • string stream_get_contents (resource handle [, int maxlen = -1 [, int offset = -1 ]]))

    Ця функція дозволяє отримати вміст потоку у вигляді рядка. Параметр handle є ресурсом потоку. Параметр maxlen містить максимальна кількістьбайт для читання. За замовчуванням він встановлений -1, що вказує на отримання всіх даних. Параметр offset містить усунення, з якого почнеться читання даних. За замовчуванням він також встановлений -1, що означає, що читання буде проведено з початкової позиції.

Нижче наведено приклад отримання даних у форматі JSON на стороні сервера:

// Відкриваємо читання потік введення $f = fopen("php://input", "r"); // Отримуємо вміст потоку $ data = stream_get_contents ($ f); if ($data) ( // Код обробки print_r(json_decode($data)); )

Отримана структура даних:

StdClass Object ( => 2013-10-10 => 2013-10-10 => Array ( => 1 => 2 => 3 => 4 => 5 => 6 => 7))

Примітка : необхідно враховувати той момент, що для роботи з форматом JSON дані повинні бути в кодуванні utf-8.

Надані JSON константи для функції json_encode()

JSON_HEX_TAG (integer) Всі кодуються в \u003C та \u003E. Доступна з PHP 5.3.0.
JSON_HEX_AMP (integer) Всі & кодуються в &. Доступна з PHP 5.3.0.
JSON_HEX_APOS (integer) Всі символи ' кодуються в \u0027. Доступна з PHP 5.3.0.
JSON_HEX_QUOT (integer) Всі символи кодуються в \u0022. Доступна починаючи з PHP 5.3.0.
JSON_FORCE_OBJECT (integer) Видавати об'єкт замість масиву під час використання неасоціативного масиву. Це корисно, коли приймаюча програма або код очікують об'єкт або масив порожній. Доступна з PHP 5.3.0.
JSON_NUMERIC_CHECK (integer) Кодування рядків, що містять числа, як числа. Доступна з PHP 5.3.3.
JSON_BIGINT_AS_STRING (integer) Кодує великі цілі числа у вигляді рядкових еквівалентів. Доступна з PHP 5.4.0.
JSON_PRETTY_PRINT (integer) Використати пробільні символиу даних, що повертаються для їх форматування. Доступна з PHP 5.4.0.
JSON_UNESCAPED_SLASHES (integer) Чи не екранувати /. Доступна з PHP 5.4.0.
JSON_UNESCAPED_UNICODE (integer) Не кодувати багатобайтні символи Unicode(за умовчанням вони кодуються як \uXXXX). Доступна з PHP 5.4.0.

Список можливих режимів для fopen() використовуючи mode

‘r’ Відкриває файл лише для читання; поміщає покажчик на початок файлу.
'r+' Відкриває файл для читання та запису; поміщає покажчик на початок файлу.
‘w’ Відкриває файл для запису; поміщає покажчик на початок файлу і обрізає файл до нульової довжини. Якщо файл не існує - намагається його створити.
‘w+’ Відкриває файл для читання та запису; поміщає покажчик на початок файлу і обрізає файл до нульової довжини. Якщо файл не існує – намагається його створити.
'a' Відкриває файл для запису; поміщає покажчик у кінець файлу. Якщо файл не існує – намагається його створити.
'a+' Відкриває файл для читання та запису; поміщає покажчик у кінець файлу. Якщо файл не існує – намагається його створити.
‘x’ Створює та відкриває тільки для запису; поміщає покажчик на початок файлу. Якщо файл вже існує, виклик fopen() закінчиться невдачею, поверне FALSE і помилку рівня E_WARNING. Якщо файл не існує, він спробує його створити. Це еквівалентно вказівкам прапорів O_EXCL|O_CREAT для внутрішнього системного виклику open(2).
‘x+’ Створює та відкриває для читання та запису; інакше має ту ж поведінку, що і'x'.
‘c’ Відкриває файл лише для запису. Якщо файл не існує, він створюється. Якщо ж файл існує, то він не обрізається (на відміну від 'w'), і виклик до цієї функції не викликає помилки (так само як і у випадку з 'x'). Вказівник на файл буде встановлений на початок файлу. Це може бути корисно при бажанні заблокувати файл (дивись flock()) перед зміною, оскільки використання 'w' може обрізати файл ще до того, як було отримано блокування (якщо ви хочете обрізати файл, можна використовувати функцію ftruncate() після запиту на блокування ).
‘c+’ Відкриває файл для читання та запису; інакше має таку ж поведінку, як і 'c'.

Всім привіт! У цій статті ми розглянемо, як надсилати дані клієнту в форматі JSON в NodeJS .

Вступ

Минулої статті ми розглянули, як надсилати HTML сторінки клієнту, використовуючи потоки в NodeJS . Сьогодні ж ми розглянемо, як надсилати дані у форматі JSON.

Ми не будемо використовувати потоки для вирішення цієї задачі, тому ви можете видалити весь код, що відноситься до них. Замість них ми будемо використовувати end() метод, який нам уже знайомий і застосовувався в одній із попередніх статей.

Як відправити JSON

Насамперед ми повинні змінити заголовок, щоб браузер зміг правильно обробити наші дані:

Res.writeHead(200, ("Content-Type": "application/json"));

Тепер давайте створимо об'єкт, який ми хочемо надіслати клієнту:

Var myObj = (
name: "John",
job: "програмер",
age: 27
};

Тепер давайте надішлемо дані клієнту:

Res.end(myObj);

Але насправді такий код не запрацює правильно. Справа в тому, що метод end() очікує побачити дані у форматі рядка або буфер. У нас є об'єкт, але ми можемо зробити з нього рядок наступним чином:

Res.end(JSON.stringify(myObj));

Тепер, якщо ви запустите програму, побачите, що дані прийшли в JSON форматі у вигляді рядка. Також можна використовувати інструменти розробника в браузері і подивитися, що заголовок також був встановлений правильно.

Навіщо надсилати JSON дані клієнту

У вас, можливо, постало питання, а навіщо взагалі відправляти дані клієнту в JSON форматі. Щоб відповісти на це питання, уявіть, що у вас є який-небудь JavaScript, що виконується на стороні клієнта (frontend), і він може створити який-небудь запит. Наприклад, у вас є API . Ви можете написати наступний запит:

Localhost:3000/api/request

І сервер повинен буде надіслати нам дані на цей запит. Найзручніше буде відправляти їх саме у форматі JSON, щоб скрипт, що працює на стороні клієнта, міг потім легко ці дані обробити.

Висновок

Отже, сьогодні ми розглянули, як надсилати дані клієнту у форматі JSON у NodeJS.

Застосування JSON на стороні сервера для отримання запитів та створення відповідей

Серія контенту: Справжня цінність JSON

Ми говорили про те, що JSON зручний як формат даних для Ajax-додатків, тому що дозволяє швидко конвертувати JavaScript-об'єкти в рядкові значення і навпаки. Так як Ajax-додатки найкраще пристосовані для відправлення та отримання звичайного тексту, то майже завжди краще використовувати той API, який вміє його генерувати; JSON же окрім цієї можливості дозволяє також працювати з рідними об'єктами JavaScriptі не турбуватися про те, як ці об'єкти виглядатимуть у тексті.

Ресурсний центр Ajax на developerWorks
Зверніться до – універсального джерела інформації про Ajax-програмування, де можна знайти статті, які навчають посібники, форуми, блоги, wiki-матеріали, інформацію про події та новини. Якщо щось відбувається, там є про це інформація.

XML має ті ж переваги текстового формату, що і JSON, проте API для перетворення JavaScript-об'єктів у XML (а такі існують, і не в однині) не так добре опрацьовані в порівнянні з програмним інтерфейсом JSON; створюючи та змінюючи об'єкти, вам іноді самим доведеться дбати про те, щоб обраний API зміг нормально працювати з цими об'єктами. З JSON все простіше: він обробляє практично всі можливі типи об'єктів і просто повертає дані в приємному JSON-уявленні.

Отже, найголовніша цінність JSON полягає в тому, що він дозволяє працювати з JavaScript як з JavaScript, а не як з мовою форматування даних. Так що ви можете застосовувати у своєму коді всі напрацьовані навички по роботі з JavaScript-об'єктами, не переймаючись тим, як ці об'єкти будуть перетворені на текст. Ви лише викликаєте наприкінці простий JSON-метод:

String myObjectInJSON = myObject.toJSONString();

і отримуєте текст, який можна надсилати на сервер.

Доставка JSON на сервер

У надсиланні даних JSON на сервер немає нічого особливо складного, але це важливий момент, і у вас є низка можливостей для вибору. Однак якщо ви зупините свій вибір на JSON, то подальші рішення приймати буде набагато простіше, так як вибір значно звузиться, і вам не доведеться сильно напружуватися з цього приводу. Зрештою, вам просто треба доставити JSON-рядок на сервер, причому бажано максимально швидко та просто.

Відправлення JSON у парах «ім'я/значення» методом GET

Найпростіший спосіб доставити JSON-дані на сервер – це перетворити їх на текст і надіслати його як значення пари «ім'я/значення». Пам'ятайте, JSON-відформатовані дані – це лише один досить великий об'єкт, який виглядає приблизно так, як показано у лістингу 1:

Лістинг 1. Простий JavaScript-об'єкт у JSON-форматі var people = ( "programmers": [ ( "firstName": "Brett", "lastName":"McLaughlin", "email": " [email protected]" ), ( "firstName": "Jason", "lastName":"Hunter", "email": " [email protected]" ), ( "firstName": "Elliotte", "lastName":"Harold", "email": " [email protected]" ] ], "authors": [ ( "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" ), ( "firstName": "Tad", "lastName": " Williams", "genre": "fantasy" ), ( "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" ) ], "musicians": [ ( "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" ), ( "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano") ] )

Отже, цей текст можна відправити серверному скрипту всередині пари «ім'я/значення», наприклад:

var url = "organizePeople.php?people=" + people.toJSONString(); xmlHttp.open("GET", url, true); xmlHttp.onreadystatechange = updatePage; xmlHttp.send(null);

Начебто все тут добре, але насправді є одна проблема: у нашому JSON-рядку з даними присутні прогалини та інші символи, які Web-браузер може спробувати інтерпретувати. Щоб ці символи не викликали проблем на сервері (і не зірвали б передачу даних) слід додати JavaScript-функцію escape() . Ось так:

var url = "organizePeople.php?people=" + escape(people.toJSONString()); request.open("GET", url, true); request.onreadystatechange = updatePage; request.send(null);

Ця функція обробляє прогалини, сліши і все інше, що може спантеличити браузер. Вона конвертує їх у «безпечні» у сенсі символи (наприклад, пропуск перетворюється на escape-послідовність %20 , яку браузери не сприймають як пропуск, а просто без змін передають на сервер). Потім сервер виконає зворотне перетворення(зазвичай автоматично), і ми отримаємо рядок у тому вигляді, в якому він був до передачі.

Цей підхід має дві недоліки:

  • По-перше, ми надсилаємо дані, розмір яких потенційно може бути дуже великим, за допомогою GET-запиту, що має обмеження на довжину URL-рядка. Максимально допустимий розмір рядка дуже великий, але ми ніколи не знаємо, наскільки довгий рядокотримаємо після перетворення об'єкта в текст, якщо цей об'єкт досить складний.
  • По-друге, ми надсилаємо дані через мережу відкритим текстом– тобто найнебезпечнішим із усіх можливих методів передачі.

Для ясності зауважу, що ці недоліки більше пов'язані з обмеженнями GET-запитів, ніж зі специфікою JSON. Однак якщо ви відправляєте на сервер більше ніж просто прізвище або ім'я користувача або результат його вибору у формі на вашому сайті, то ці недоліки можуть неабияк зіпсувати вам життя. Якщо ви починаєте працювати з даними, які можуть бути хоч скільки-небудь конфіденційними або володіти великим розміром, вам безперечно слід звернути свою увагу на POST-запити.

Передача JSON-даних методом POST

Якщо ви вирішили використовувати для надсилання JSON-даних на сервер метод POSTзамість GET, то великих зміну код вносити не доведеться. Ось все, що потрібно зробити:

var url = "organizePeople.php?timeStamp=" + new Date().getTime(); request.open("POST", url, true); request.onreadystatechange = updatePage; request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.send(people.toJSONString());

Більшість цього коду має бути вам знайома за статтею " : у якій обговорювалося створення POST-запросов. Тут ми відкриваємо запит, використовуючи POST замість GET, і встановлюємо відповідний заголовок «Content-Type», що вказує на тип очікуваних даних. даному випадкувін буде виглядати так: application/x-www-form-urlencoded , даючи зрозуміти серверу, що ми передаємо просто текстові дані, які він у принципі міг би отримати і зі звичайної HTML-форми.

Ще однією невеликою зміною коду є додавання до URL поточногочасу. Це зроблено для того, щоб запобігти кешування запитів і забезпечити їх створення та надсилання при кожному виклику методу; рядки URLщоразу трохи відрізнятимуться завдяки зміні тимчасової мітки. Це прийом, що часто використовується, що гарантує, що POST-запит буде дійсно щоразу генеруватися заново і Web-браузер не спробує кешувати відповіді від сервера.

JSON – це просто текст

При використання GETі POST-запитів дуже важливо, що JSON - це, зрештою, звичайний текст. З ним можна легко працювати і передавати серверу, оскільки він не потребує спеціального кодування. Текстові дані можна обробити будь-яким серверним скриптом. Якби JSON був двійковим форматом або якимось хитро закодованим текстом, все було б не так просто. Отже, JSON – це звичайні текстові дані, які скрипт у принципі міг би отримати і при підтвердженні HTML-форми (як ми бачили, коли йшлося про заголовок «Content-Type» у POST-запитах), тому вам не потрібно сильно морочитися щодо відправки його на сервер.

Інтерпретація JSON на сервері

Як тільки ви написали свій клієнтський JavaScript-код, що дозволяє користувачам взаємодіяти з вашими Web-сторінками та формами, та отримали інформацію, яку треба відправити на обробку серверній програмі, головною дійовою особою у вашому додатку (і, ймовірно, у всьому тому, що ми називаємо "Ajax-додатками", припускаючи, що виклик серверного скрипта виконується асинхронно) стає сервер. І тут вибір, який ви зробили на стороні клієнта, вирішивши використовувати JavaScript-об'єкти та JSON-дані, має збігатися з відповідним рішенням на стороні сервера, де вибирається API для декодування JSON-даних.

Два етапи впровадження JSON на сервер

Робота з JSON на стороні сервера незалежно від використовуваного серверної мовискладається, по суті, із двох етапів:

  • Пошук JSON-парсера/інструментарію/допоміжного API для вашої серверної мови
  • Застосування JSON-парсера/інструментарію/допоміжного API для вилучення даних із запиту клієнта та перетворення їх на вигляд, зрозумілий серверному скрипту
  • І це все, що потрібно зробити. Давайте детальніше розглянемо обидва етапи.

    Пошук JSON-парсера

    Найкращим ресурсом для пошуку JSON-парсера та інших інструментальних програмних засобів, пов'язаних з JSON, є Web-сайт JSON (див. посилання в ). Крім навчальної інформації про формат, на цій сторінці можна знайти посилання на JSON-інструментарії (tools) і JSON-парсери під будь-які платформи: від ASP до Erlang, від Pike до Ruby. Просто знайдіть там мову, якою написаний ваш скрипт, і завантажте відповідний інструментарій (toolkit). Скопіюйте його собі або оновіть за допомогою нього версію вашої серверної мови або просто встановіть її (є багато варіантів: все залежить від того, що ви використовуєте на сервері: C#, PHP, Lisp або щось інше), головне - щоб скрипти або програми у вас на сервері могли використовувати цей інструментарій.

    Наприклад, якщо ви використовуєте PHP, досить просто оновити його до недавньої версії 5.2, в яку за замовчуванням включено JSON-розширення. Це, мабуть, найпростіший спосіб почати працювати з JSON, якщо ви використовуєте PHP. Якщо ж ви використовуєте Java-сервлети, то найпростіше задіяти пакет org.json із сайту json.org. Для цього потрібно завантажити архів json.zip з Web-сайту JSON, скопіювати файли з вихідними кодамикомпіляційну директорію вашого проекту і відповідно скомпілювати їх - і ви вже зможете працювати з JSON. Приблизно те саме треба зробити і при використанні інших мов; найкращий помічнику цьому ваш власний досвід програмування під відповідну серверну платформу.

    Використання JSON-парсеру

    Після того, як необхідний інструментарій встановлений, залишається тільки викликати потрібний метод. Наприклад, припустимо, що ми використовуємо PHP та модуль JSON-PHP:

    // Це лише фрагмент великого серверного PHP-скрипту require_once("JSON.php"); $json = new Services_JSON(); // приймаємо POST-дані та декодуємо їх $value = $json->decode($GLOBALS["HTTP_RAW_POST_DATA"]); // тепер працюємо зі змінною $value як із звичайними «сирими» даними PHP

    За допомогою цього коду ми поміщаємо всі дані (масиви, множинні рядки, одиничні значення - все, що було в JSON-структурі з даними) в змінну $value, причому в рідному PHP-форматі.

    Якби ми використовували на сервері Java-сервлети та пакет org.json, то код виглядав би приблизно так:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ( StringBuffer jb = новий StringBuffer(); String line = null; try ( BufferedReader reader = request.getReader(); != null) jb.append(line); ) catch (Exception e) ( //повідомлення про помилку ) try ( JSONObject jsonObject = new JSONObject(jb.toString()); ) catch (ParseException e) ( // crash and burn throw new IOException("Помилка при розборі рядка запиту"); ) // Працюємо з даними, використовуючи методи типу: // int someInt = jsonObject.getInt("intParamName"); // String someString = jsonObject.getString("stringParamName "); // JSONObject nestedObj = jsonObject.getJSONObject("nestedObjName"); // JSONArray arr = jsonObject.getJSONArray("arrayParamName"); // і так далі... )

    Докладнішу інформацію можна знайти в документації до пакету org.json (див. посилання у розділі ). (Зауваження: якщо ви хочете детальніше вивчити org.json або інші програмні засоби для роботи з JSON, напишіть мені на e-mail і повідомте про це. Ваші відгуки допомагають мені вирішити, про що слід писати далі!).

    Висновок

    Тепер ви вже маєте знати технічний біквикористання JSON на сервері. Але в цій та статтях мені хотілося не тільки показати кілька технічних аспектів, але й переконати вас у тому, що JSON – дуже гнучкий та потужний формат даних. Навіть якщо ви не будете використовувати його в кожному своєму додатку, хороший Ajax-і JavaScript-програміст завжди повинен мати під рукою цей корисний інструменті вміти застосувати його, коли в цьому виникне потреба.

    Мені безперечно хотілося б почути про ваше власний досвідроботи з JSON і те, які мови, на вашу думку, добре - або може бути не дуже - працюють з JSON-даними на стороні сервера. Загляньте на сторінку групи новин про Java та XML (посилання в ) і розкажіть мені про це. Насолоджуйтесь JSON і всією потужністю текстових форматів даних.

    9 відповідей

    Я отримав багато інформації тут, тому я хотів опублікувати рішення, яке я виявив.

    Проблема: Отримання даних JSON з Javascript у браузері, на сервері та використання PHP для його успішного аналізу.

    Середовище: Javascript у браузері (Firefox) у Windows. LAMP-сервер як віддалений сервер: PHP 5.3.2 на Ubuntu

    Що працює (версія 1):
    1) JSON – це просто текст. Текст у певному форматі, але тільки текстовий рядок.

    2) У Javascript, var str_json = JSON.stringify(myObject) дає мені рядок JSON.

    3) Я використовую об'єкт AJAX XMLHttpRequest в Javascript для надсилання даних на сервер:
    request= new XMLHttpRequest()
    request.open("POST", "JSON_Handler.php", true)
    request.setRequestHeader("Content-type", "application/json")
    request.send(str_json)
    [... code to display response ...]

    4) На сервері PHP-код для читання рядка JSON:
    $str_json = file_get_contents("php://input");
    Це зчитує необроблені дані POST. $str_json тепер містить точний рядок JSON із браузера.

    Що працює (версія 2):
    1) Якщо я хочу використовувати заголовок запиту "application/x-www-form-urlencoded", мені потрібно створити стандартний рядок POST "x=y&a=b" , щоб при її отриманні PHPвона могла поміщатися в асоціативний масив $_POST. Отже, Javascript в браузері:

    Var str_json = "json_string=" + (JSON.stringify(myObject))

    Тепер PHP зможе заповнити масив $_POST, коли відправлю str_json через AJAX/XMLHttpRequest, як у версії 1 вище.

    Відображення вмісту $_POST["json_string"] відображає рядок JSON. Використання json_decode() в елементі масиву $_POST за допомогою рядка json буде правильно декодувати ці дані та помістити їх у масив/об'єкт.

    Пастка, з якою я зіткнувся:
    Спочатку я спробував відправити рядок JSON із заголовком програми /x -www-form-urlencoded, а потім спробував одразу прочитати його з масиву $_POST в PHP. Масив $_POST завжди був порожнім. Це тому, що він чекає на дані форми yval = xval & . Він не знайшов таких даних, тільки рядок JSON, і він просто викинув його. Я переглянув заголовки запитів, і дані POST були надіслані правильно.

    Аналогічно, якщо я використовую заголовок application/json, я знову не можу отримати доступ до даних, що надсилаються через масив $_POST. Якщо ви хочете використовувати заголовок вмісту програми /json, тоді ви повинні отримати доступ до необроблених даними POSTв PHP через вхід php://, а не $_POST.

    Література:
    1) Як отримати доступ до даних POST у PHP: Як отримати доступ до даних POST на PHP?
    2) Детальна інформаціяпро тип application/json з деякими зразковими об'єктами, які можуть бути перетворені на рядки JSON та надіслані на сервер: http://www.ietf.org/rfc/rfc4627.txt< ш >

    Javascript файлз використанням jQuery (чистіший, але накладні витрати на бібліотеку):

    $.ajax(( type: "POST", url: "process.php", data: (json: JSON.stringify(json_data)), dataType: "json" )));

    Файл PHP (process.php):

    Directions = json_decode($_POST["json"]); var_dump(directions);

    Зверніть увагу, що якщо ви використовуєте функції зворотного дзвінка у своєму javascript:

    $.ajax(( type: "POST", url: "process.php", data: (json: JSON.stringify(json_data)), dataType: "json" )) .done(function(data) ( console.log ("done"); console.log(data); )) .fail(function(data) ( console.log("fail"); console.log(data); ));

    Ви повинні у своєму PHP файлі повернути об'єкт JSON (у форматуванні javascript), щоб отримати результат "зроблений/успішний" у вашому коді Javascript. При мінімальному поверненні/друку:

    Print("()");

    Хоча для чогось серйознішого ви повинні явно відправити правильний заголовокз відповідним кодом відповіді.

    Існує 3 релевантні способи відправлення даних з клієнтської сторони (HTML, Javascript, Vbscript..etc) на серверний бік(PHP, ASP, JSP... і т.д.)

    1. HTML form Posting Request (GET або POST). 2. AJAX (This also comes under GET and POST) 3. Cookie

    Форма запиту на публікацію HTML (GET чи POST)

    Це метод, що найчастіше використовується, і ми можемо відправити більше даних за допомогою цього методу.

    Це асинхронний метод, і це має працювати безпечним способом, тут ми також можемо надіслати більше даних.

    Це гарний спосібвикористовувати невелику кількість нечутливих даних. це кращий спосіброботи з бітом даних.

    У вашому випадку ви можете віддати перевагу відправленню HTML-форми або AJAX. Але перед відправкою на сервер підтвердіть свій json самостійно або скористайтеся посиланням, наприклад http://jsonlint.com/

    Якщо Json Object конвертує його в String з використанням JSON.stringify(object), якщо у вас є рядок JSON, відправте його як є.

    Простий приклад JavaScript для введення полів HTML (відправка на сервер JSON, розбір JSON в PHP і відправка назад клієнту) за допомогою AJAX:

    Last Name
    Age
    Show var xmlhttp; function actionSend() ( if (window.XMLHttpRequest) (// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp = new XMLHttpRequest(); ) else (// code for IE6, IE5 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); ) var values ​​= $("input").map(function () ( return $(this).val(); ) ). get (); var myJsonString = JSON.stringify(values); xmlhttp.onreadystatechange = respond; xmlhttp.open("POST", "ajax-test.php", true); xmlhttp.send(myJsonString); ) function respond() ( if (xmlhttp.readyState == 4 && xmlhttp.status == 200) ( document.getElementById("result").innerHTML = xmlhttp.responseText; ) )

    PHP файл ajax-test.php: