2013-08-22 2 views
6

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

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

key1 = value1 & key2 = значение2 & ключ3 = value3

я используя application/json в качестве входных данных (в ОТДЫХ).

Как { 'key1': 'значение1', 'key2': 'значение2', 'ключ3': '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

+0

первых вещей, чтобы проверить , то есть версии php одинаковы, и если установлен 'allow_fopen_url' – DevZer0

+0

Попробуйте' var_dump ($ this-> json_input_data) 'in' __construct() ' –

+0

@RohanKumar -> он выводит« NULL »на сервере, где я размещен. Prints "(2) { [" id "] => строка (2)" 79 " [" t "] => строка (5)" 22_00 " }" в локальном хосте. –

ответ

2

PHP:.? // вход является потоком только для чтения, который позволяет вам считывать необработанные данные из тела запроса. В случае запросов POST предпочтительно использовать для использования ввода php: // вместо $ HTTP_RAW_PO ST_DATA, так как это не зависит от специальных директив php.ini. Более того, для тех случаев, когда $ HTTP_RAW_POST_DATA по умолчанию не заполняется, потенциально может быть менее интенсивной в памяти альтернативой активации always_populate_raw_post_data. php: // ввод не доступен с enctype = "multipart/form-data".

См 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.

+0

Я видел обертки, а также вход не enctype = "multipart/form-data". Он отлично работает в локальном хосте, но веб-сервер, на котором я использовал хост, возвращает null, в то время как я использую php: // input. Может быть, это способ запретить доступ к этому. Я хочу знать, можно ли это делать другими способами? –

+0

@ArjunRaj проверить выше, я обновил свой ответ. –

+0

он дает «NULL» на сервере, который я размещал. Prints "array (2) {[" id "] => string (2)" 79 "[" t "] => string (5)" 22_00 "}" в localhost. Это упоминается в комментариях к вопросу. Я думаю, что «php: // input» недоступен на этом веб-сервере. –

2

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

Осторожнее с одинарными кавычками внутри вашего JSON

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

the name and value must be enclosed in double quotes 
single quotes are not valid 

$bad_json = "{ 'bar': 'baz' }"; 
json_decode($bad_json); // null 
Смежные вопросы