Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Какие есть способы принять JSON

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Hapson
Отправлено: 23 Марта, 2014 - 13:55:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Собственно вопрос в названии - какие есть способы принять JSON на стороне сервера.
Допустим я отправляю "Content-Type: application/json" и в теле POST пуляю сам объект.



Как его поймать в php? Я знаю только один способ: прочитать php://input

PS че картинки-то не отображаются?
(Добавление)
PPS Уточню
Если отправлять key=JsonObject, то объект я получу в $_POST['key']
А если отправить просто JsonObject, то его я могу получить только в php://input
Интересует именно второй вариант

(Отредактировано автором: 23 Марта, 2014 - 13:55:49)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Мелкий Супермодератор
Отправлено: 23 Марта, 2014 - 14:08:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Hapson пишет:
прочитать php://input

И чем не подходит?


-----
PostgreSQL DBA
 
 Top
teddy
Отправлено: 23 Марта, 2014 - 14:09:22
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




JSON это строка - формат данных
если пульнули $_POST-ом, соответственно получить его можно так же и на сервере
PHP:
скопировать код в буфер обмена
  1. $json = json_decode($_POST['jsondata'], true);
  2. var_dump($json);//массив данных
 
 Top
Hapson
Отправлено: 23 Марта, 2014 - 14:10:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Мелкий пишет:
Hapson пишет:
прочитать php://input

И чем не подходит?

Подходит, просто интересно - это единственный способ, или еще как-то можно.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
teddy
Отправлено: 23 Марта, 2014 - 15:21:29
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Да кстати не заметил изначально
Hapson пишет:
Если отправлять key=JsonObject, то объект я получу в $_POST['key']
А если отправить просто JsonObject, то его я могу получить только в php://input


php://input в данном случае фактически тот же $_POST['key']
когда мы отправляем данные на сервер, они не сразу ложался в $_POST. PHP обрабатывает строку с данными которая была отправлена через HTTP на сервер. Фактически этот глобальный массив можно рассматривать как "удобство" для разработчика, что бы не приходилось парсить сырые данные самостоятельно.

Думаю небольшой пример прояснит этот момент
PHP:
скопировать код в буфер обмена
  1. if($_SERVER['REQUEST_METHOD'] == 'POST') {
  2.     $data = file_get_contents("php://input");
  3.     echo $data;
  4. }


CODE (html):
скопировать код в буфер обмена
  1. <form action="" method="post" >
  2.     <input type="text" name="name" />
  3.     <input type="submit" />
  4. </form>


Когда мы отправим запрос на сервер методом POST через форму то в php://input прилетит в виде name=то что мы прислали из этого инпута

Посему разницы как таковой в получении данных через php://input и $_POST['key'] - никакой. Второй вариант даже удобнее.

Я прав? Если да тогда
Hapson пишет:
Интересует именно второй вариант

не понятно что именно интересует если это одно и то же за исключением того что один вариант отдает данные в сыром виде а другой те же данные но уже разбитые в массив $_POST по принципу ключ-значение.

(Отредактировано автором: 23 Марта, 2014 - 16:28:13)

 
 Top
Hapson
Отправлено: 23 Марта, 2014 - 15:32:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


teddy
1) отправляю на сервер
CODE (javascript):
скопировать код в буфер обмена
  1. JSON.stringify({name:"masha"})

$_POST - пустой
php://input - {"name":"masha"}
2) опять отправляю
CODE (javascript):
скопировать код в буфер обмена
  1. "param="+ JSON.stringify({name:"masha"})

$_POST['param'] = {"name":"masha"}
php://input - param={"name":"masha"}
(Добавление)
PS если в отправляемой строке нет ни одного знака "=", то POST пустой, но эти данные можно поймать в php://input

(Отредактировано автором: 23 Марта, 2014 - 15:33:41)



-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Ch_chov
Отправлено: 23 Марта, 2014 - 16:00:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




teddy пишет:
Посему разницы как таковой в получении данных через php://input и $_POST['key'] - никакой.

Разница есть. Массив $_POST формируется только если входные данные отформатированны специальным образом var1=val1&var2=val2&var3=val3 и имеют тип application/x-www-form-urlencoded. Поэтому для обработки json запросов часто используют php://input.
 
 Top
teddy
Отправлено: 23 Марта, 2014 - 16:24:15
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Я все равно разницу итогового результата не уловил... если Вам просто интересны различные способы для получения сырых данных то как вариант можете посмотреть ещё $HTTP_RAW_POST_DATA но это будет работать при условии если в php.ini активна директива always_populate_raw_post_data и если enctype не "multipart/form-data"

Ch_chov
Ch_chov пишет:
Массив $_POST формируется только если входные данные отформатированны специальным образом var1=val1&var2=val2&var3=val3

это я как бы выше сам отметил Улыбка

Ch_chov пишет:
и имеют тип application/x-www-form-urlencoded

Не думаю что Вы правы или просто неверно высказались...Получается если я поставлю multipart/form-data тогда по вашему я не смогу получить значения из формы через $_POST? Получал же, и не раз... Улыбка

Можете сами в этом убедиться

PHP:
скопировать код в буфер обмена
  1. if($_SERVER['REQUEST_METHOD'] == 'POST') {
  2.     var_dump($_POST);
  3. }


CODE (html):
скопировать код в буфер обмена
  1. <form action="" method="post" enctype="multipart/form-data" >
  2.     <input type="text" name="name" />
  3.     <input type="submit" />
  4. </form>




P.S: Ни разу не испытывал проблем с JSON-ом и не приходилось парсить сырые данные.

(Отредактировано автором: 23 Марта, 2014 - 16:37:46)

 
 Top
Ch_chov
Отправлено: 23 Марта, 2014 - 18:37:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Да, для multipart/form-data $_POST тоже формируется, а вот php://input нет. В остальных случаях $_POST массива не будет.

teddy пишет:
Ни разу не испытывал проблем с JSON-ом и не приходилось парсить сырые данные.

В $_POST массиве данные такие же "сырые". Существенной разницы нет. Можно использовать оба способа. Хотя вариант с php://input кажется более логичным.
Зачем заставлять клиент форматировать данные в x-www-form-urlencoded если они не имеют отношение к html формам? Можно положить в post "чистый" json и указать в заголовке запроса тип application/json.
 
 Top
Hapson
Отправлено: 23 Марта, 2014 - 18:45:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


teddy пишет:
Ни разу не испытывал проблем с JSON-ом и не приходилось парсить сырые данные.

При условии, что JS скрипт отправляет строку вида "key=value", но если отправить тупо "key", то $_POST будет пустой, а "key" можно будет поймать только в php://input.
Еще раз: если в отправляемой строке нет знака "=", то POST будет пустой. Хоть поэму пульни постом, если в тексте нет = ,то ловим его в php://input.
Заголовки значения не имеют, хоть multipart/form-data, хоть application/x-www-form-urlencode d или application/json... Если отправляется строка, и если строка правильная (urlencode), то она улетит на сервер. А уж как и где ее ловить - есть варианты.

Я сейчас пишу обертку для ajax на JS, поэтому интересуюсь.


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Ch_chov
Отправлено: 23 Марта, 2014 - 18:54:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Hapson пишет:
заголовки значения не имеют, хоть multipart/form-data, хоть application/x-www-form-urlencode d или application/json
Ну вот попробуй поставить content-type: application/json и найти свои данные в $_POST массиве.

CODE (javascript):
скопировать код в буфер обмена
  1. $.ajax({
  2.   type: "POST",
  3.   url: 'http://example.com/',
  4.   data: {key: 'value'},
  5.   contentType: 'application/json'
  6. });

(Отредактировано автором: 23 Марта, 2014 - 19:07:56)

 
 Top
Hapson
Отправлено: 23 Марта, 2014 - 19:07:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Ch_chov пишет:
Ну вот попробуй поставить content-type: application/json и найти свои данные в $_POST массиве.

Да, POST пустой.
Ch_chov пишет:
для multipart/form-data $_POST тоже формируется, а вот php://input нет

Нет, данные приходят в php://input. Если нет ничего в php://input, то и в POST ничего не будет
(Добавление)
Ch_chov пишет:
Ну вот попробуй поставить content-type: application/json и найти свои данные в $_POST массиве.

Хотя я все правильно написал
Hapson пишет:
Заголовки значения не имеют, хоть multipart/form-data, хоть application/x-www-form-urlencode d или application/json... Если отправляется строка, и если строка правильная (urlencode), то она улетит на сервер. А уж как и где ее ловить - есть варианты.

php://input есть всегда, если что-то послали


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
Ch_chov
Отправлено: 23 Марта, 2014 - 19:25:06
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Hapson пишет:
Заголовки значения не имеют
Имеют. Если content-type: application/json, то $_POST массива не будет.

Hapson пишет:
Нет, данные приходят в php://input. Если нет ничего в php://input, то и в POST ничего не будет
Ну вот у меня не приходят и в документации написано, что не должны приходить.

php.net пишет:
php://input is not available with enctype="multipart/form-data".

(Отредактировано автором: 23 Марта, 2014 - 19:27:50)

 
 Top
Hapson
Отправлено: 23 Марта, 2014 - 20:18:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 356
Дата рег-ции: Июнь 2013  
Откуда: Ставропольский край


Помог: 10 раз(а)

[+]


Ch_chov пишет:
Ну вот у меня не приходят и в документации написано, что не должны приходить.

Странно... я еще не допилил отправку multipart, может поэтому.
Ch_chov пишет:
Имеют. Если content-type: application/json, то $_POST массива не будет.

Конечно не будет, строка будет в сыром виде


-----
ПЫХ тут - ходи туда, прежде чем писать сюда (толку больше будет)
 
 Top
teddy
Отправлено: 23 Марта, 2014 - 22:14:41
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Ch_chov
Не знаю как для Вас, но для меня "сырые" значит ещё не прошедшие парсинг данные Улыбка Поэтому то что уже лежит в $_POST, для меня не сыро ;)
Ch_chov пишет:
Зачем заставлять клиент форматировать данные в x-www-form-urlencoded если они не имеют отношение к html формам?

Если используется jQuery, тогда не обязательно отправлять Content-Type самостоятельно, он сделает это за нас Улыбка А вот без jQuery, средствами чистого JS, отправлять придется... По поводу форм ещё хотел бы отметить то, что тег form содержит enctype вида "x-www-form-urlencoded" по умолчанию, именно такой заголовок и будет отправлен jQuery, если мы не укажем явно свой Улыбка
А как удобно - тут скорее на выбор...

Hapson
Это понятно. Не понятно зачем так делать... Зачем пропускать key, потом искать свои данные не в $_POST? - Это до меня не доходит. Что ты хочешь получить в итоге? Опиши конкретнее что есть, что надо получить и в чем затык. key=>val на сервере, то пробежись по своему объекту данных, формируй строку запроса в цикле, приклеивай к строке его key, прогоняй через encodeURIComponent и всё.

P.S: Для практики неплохая задачка, но в реальности толку мало, ибо jQuery уже давно придуман ;)

(Отредактировано автором: 23 Марта, 2014 - 23:28:26)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB