Чтение ввода json в php

php://input работает правильно в localhost. Но на сервере он возвращается пустым. Вход (запрос) на мой сайт - это json (REST - application/json type), поэтому $_POST не работал (пожалуйста, прочитайте Этот вопрос).

$_ POST работает с входами типа пары ключ-значение, такими как данные формы или x-www-urlencoded

ключ1 = значение1 & ключ2 = значение2 & ключ3 = значение3

Я использую application/json как вход (в REST).

Как {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

Это невозможно с помощью $_POST. Но использование php://input может помочь прочитать эти данные.

Мой код

class Webservice_Controller extends CI_Controller {
 public $json_input_data;
 public function __construct(){
 parent::__construct();
 $this->json_input_data = json_decode(file_get_contents('php://input'),TRUE);
 }
 public function json_input($label){
 if(isset($this->json_input_data[$label])) return $this->json_input_data[$label];
 else return NULL;
 }
}

Выше код работает отлично и на другом веб-сервере, но не в текущем.: (

Я думаю, что мой веб-сервер запрещает доступ к php://input.

Есть ли какие-либо другие методы для чтения json-входа в php?

2 ответа

php://input - поток, доступный только для чтения, который позволяет вам читать исходные данные от органа запроса. В случае запросов POST предпочтительнее использовать вход php://вместо $HTTP_RAW_POST_DATA, поскольку он не зависят от специальных директив php.ini. Более того, для тех случаев, когда $HTTP_RAW_POST_DATA по умолчанию не заполняется, это потенциально менее энергоемкая альтернатива активации always_populate_raw_post_data. php://ввод недоступен с ENCTYPE = "многочастному/форм-данных" .

См. wrappers

Попробуйте также,

....
 public function __construct(){
 parent::__construct();
 if(isset($_POST))
 {
 var_dump(file_get_contents('php://input'));
 $this->json_input_data=json_decode(file_get_contents('php://input'),TRUE);
 }
 else echo 'Not Post';
 }
....

Также проверьте allow_url_fopen.


Я знаю, что это старо, но это может помочь другим:

Осторожно с одинарными кавычками внутри json

Из документации PHP о json_decode:

the name and value must be enclosed in ****** quotes
single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null

licensed under cc by-sa 3.0 with attribution.