Получить данные JSON POST в CodeIgniter

Я пытаюсь получить данные JSON из моего php-файла. Он дает мне трудное время. Это мой код

Код в моем просмотре:

var productDetails = {'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}; var base_url = '<?php echo site_url() ?>'; $.ajax({ url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart", type: 'POST', data:productDetails, dataType:'JSON', }); 

Попытка получить в моем контроллере:

 echo $this->input->post("productDetails"); 

Выходы ничего.

Вот мои заголовки:

 Remote Address:[::1]:80 Request URL:http://localhost/CI/index.php/user/Add_to_cart/addProductsToCart Request Method:POST Status Code:200 OK Request Headersview source Accept:application/json, text/javascript, */*; q=0.01 Accept-Encoding:gzip, deflate Accept-Language:en-US,en;q=0.8,fr;q=0.6 Connection:keep-alive Content-Length:52 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Cookie:ci_session=3E5SPro57IrJJkjs2feMNlmMrTqEXrTNN8UyEfleeothNnHwNxuCZDSx4a7cJZGjj7fyr2KLpj%2BPNJeGRSzSPVmcFHVEdhSk4D47ziOl4eZcTUAZlQrWa3EYIeQJVWxMpiGZS26MEfbSXNmfel9e8TcsJTreZHipvfisrJovbXEAW4Uv%2BwrJRep1KCi1MMaDCVJb9UEinRVcDtYe%2F86jhn7kOj4kraVmVzx%2FsOaO0rAxLyAUtez%2Feaa4zBwpN3Td153sAoIb3WxVHoEj2oKyH5prVHigbIhIBR6XZqjBkM6hjBuoD2OSZ2wgLbp9DEENMoqui4WYyHROBuS2DYiJajblcS0KiFga5k%2FQOODvE7p6n%2BozN5ciDliVjJ4PnJ5PD1GaPEmec5%2FbQSlOHYWZk%2F2Blzw3Nw0EtLL7wKDzzQY%3Df645c36bb3548eb8de915b73f8763d97a47783ce Host:localhost Origin:http://localhost Referer:http://localhost/CI/index.php/user/view_available_books/viewAvailableBooks/5 User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 X-Requested-With:XMLHttpRequest **Form Dataview** sourceview URL encoded id:234 qty:1 price:0.00 name:dasdadsd2q3e!@!@@ - Remote Address:[::1]:80 Request URL:http://localhost/CI/index.php/user/Add_to_cart/addProductsToCart Request Method:POST Status Code:200 OK Request Headersview source Accept:application/json, text/javascript, */*; q=0.01 Accept-Encoding:gzip, deflate Accept-Language:en-US,en;q=0.8,fr;q=0.6 Connection:keep-alive Content-Length:52 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 Cookie:ci_session=3E5SPro57IrJJkjs2feMNlmMrTqEXrTNN8UyEfleeothNnHwNxuCZDSx4a7cJZGjj7fyr2KLpj%2BPNJeGRSzSPVmcFHVEdhSk4D47ziOl4eZcTUAZlQrWa3EYIeQJVWxMpiGZS26MEfbSXNmfel9e8TcsJTreZHipvfisrJovbXEAW4Uv%2BwrJRep1KCi1MMaDCVJb9UEinRVcDtYe%2F86jhn7kOj4kraVmVzx%2FsOaO0rAxLyAUtez%2Feaa4zBwpN3Td153sAoIb3WxVHoEj2oKyH5prVHigbIhIBR6XZqjBkM6hjBuoD2OSZ2wgLbp9DEENMoqui4WYyHROBuS2DYiJajblcS0KiFga5k%2FQOODvE7p6n%2BozN5ciDliVjJ4PnJ5PD1GaPEmec5%2FbQSlOHYWZk%2F2Blzw3Nw0EtLL7wKDzzQY%3Df645c36bb3548eb8de915b73f8763d97a47783ce Host:localhost Origin:http://localhost Referer:http://localhost/CI/index.php/user/view_available_books/viewAvailableBooks/5 User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 X-Requested-With:XMLHttpRequest **Form Dataview** sourceview URL encoded id:234 qty:1 price:0.00 name:dasdadsd2q3e!@!@@ 

Мой ответ, который я вижу в инструментах разработчика:

  Array ( [id] => 234 [qty] => 1 [price] => 0.00 [name] => dasdadsd2q3e!@!@@ ) 

Но в браузере вывод ничего. Я пытаюсь решить его уже более 4 часов, но напрасно.

 print_r($_POST); // outputs nothing echo $data = file_get_contents('php://input'); //outputs nothing echo $id = $this->input->post('productDetails');// outputs nothing 

Мой код:

 <script> $('#addtoCart').on('click',function(event){ event.preventDefault(); $(this).attr('disabled',"disabled"); finalprice = $.trim($('#price').val()); finalqty = $.trim($('#quantity').val()); var productDetails = JSON.stringify({'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}); var base_url = '<?php echo site_url() ?>'; // console.log($); $.ajax({ url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart", type: 'POST', contentType: "application/json; charset=utf-8", data:productDetails, dataType:'html', }); }); </script> Детали <script> $('#addtoCart').on('click',function(event){ event.preventDefault(); $(this).attr('disabled',"disabled"); finalprice = $.trim($('#price').val()); finalqty = $.trim($('#quantity').val()); var productDetails = JSON.stringify({'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}); var base_url = '<?php echo site_url() ?>'; // console.log($); $.ajax({ url: "<?php echo base_url() ?>index.php/user/Add_to_cart/addProductsToCart", type: 'POST', contentType: "application/json; charset=utf-8", data:productDetails, dataType:'html', }); }); </script> 

Код контроллера:

 function addProductsToCart(){ var_dump(json_decode(file_get_contents("php://input"))); print_r($_POST); // $data = json_decode($_POST["productDetails"]); // var_dump($data); // echo $data = file_get_contents('php://input'); // print_r(json_decode($data)); // $id = $this->input->post('id'); // $qty = $this } 

Общий метод, который я использую для своих Ajax-вызовов в CI:

JS:

 post_array = { "myvar" : "value1", "myvar2": "value2" } $.post(baseUrl + "/AjaxController/my_function", post_array, function(data) { var res = jQuery.parseJSON(data); alert(res.property); } 

Контроллер:

 public function my_function() { $myvar = $this->input->post('myvar'); $myvar2 = $this->input->post('myvar2'); //Stuff echo json_encode($myobject); } 

У меня была точно такая же проблема. CodeIgniter не знает, как получить JSON. Сначала я думал о кодировке. Потому что я использую fetch.js а не jQuery . Что бы я ни делал, я делал заметку. $_POST был пуст, а также $this->input->post() . Вот как я решил проблему.

Отправить запрос (как объект prop – потому что ваш js lib может меняться):

 method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ ready: 'ready' }) 

Узел: Я кодирую свои данные object типа в json . jQuery делает это самостоятельно, когда вы устанавливаете параметр dataType: 'JSON' .

CodeIgniter (3.1 в моем случае):

 $stream_clean = $this->security->xss_clean($this->input->raw_input_stream); $request = json_decode($stream_clean); $ready = $request->ready; 

Примечание. Вам нужно очистить свой $this->input->raw_input_stream . Вы не используете $this->input->post() что означает, что это не делается автоматически с помощью CodeIgniter.

Что касается ответа:

 $response = json_encode($request); header('Content-Type: application/json'); echo $response; 

В качестве альтернативы вы можете:

 echo $stream_clean; 

Примечание. Не требуется устанавливать header('Content-Type: application/json') но я считаю, что это хорошая практика. request уже установил заголовок 'Accept': 'application/json' .

Итак, трюк здесь состоит в том, чтобы использовать $this->input->raw_input_stream и $this->input->raw_input_stream декодировать ваши данные.

У вас есть только собственный ответ.

print_r($_POST);

Вернуть :

 Array ( [id] => 234 [qty] => 1 [price] => 0.00 [name] => dasdadsd2q3e!@!@@ ) 

Тогда как вы получите: echo $id = $this->input->post('productDetails');

Вы получите идентификатор echo $id = $this->input->post('id');

Хотя OP кажется удовлетворительным, выбранный ответ не говорит нам о причине и реальном решении. (Кстати, post_array не является массивом, это действительно объект). Ответ @ jimasun имеет правильный подход. Я просто проясню ситуацию и добавлю решение за пределы CI.

Поэтому причиной проблемы является;

Не CI или PHP, но ваш сервер не знает, как обращаться с запросом, у которого есть тип содержимого приложения / json. Таким образом, у вас не будет данных $ _POST. Php не имеет к этому никакого отношения. Читайте больше на: Чтение JSON POST с помощью PHP

И решение есть; Либо не отправляйте запрос в качестве приложения / json или тела запроса процесса, чтобы получать сообщения.

Для ответа CI @ jimasun это точный способ.

И вы также можете получить тело запроса с использованием чистого PHP.

 $json_request_body = file_get_contents('php://input');