在CodeIgniter中检索JSON POST数据

我一直在尝试从我的php文件中检索JSON数据。它让我很难。这是我的代码

我的视图中的代码:

var productDetails = {'id':ISBNNumber,'qty':finalqty,'price':finalprice,'name':bookTitle}; var base_url = ''; $.ajax({ 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!@!@@ 

我在Developer工具中可以看到的响应:

  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 

我的观点代码:

  $('#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 = ''; // console.log($); $.ajax({ url: "index.php/user/Add_to_cart/addProductsToCart", type: 'POST', contentType: "application/json; charset=utf-8", data:productDetails, dataType:'html', }); });  

控制器代码:

 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 } 

我用于CI中的Ajax调用的一般方法:

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() 。 这就是我解决问题的方法。

发送请求(作为对象道具 – 因为你的js lib可能会有所不同):

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

节点:我将object类型的数据编码为json 。 当您设置dataType: 'JSON'选项时, jQuery会自行完成此操作。

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并自己解码数据。

你只有自己的答案。

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,但您的服务器不知道如何处理具有application / json内容类型的请求。 所以你没有$ _POST数据。 Php与此无关。 阅读更多内容: 使用PHP阅读JSON POST

解决方案是; 要么不发送请求作为application / json或进程请求体来获取发布数据。

CI @ jimasun的回答是精确的方式。

你也可以使用像这样的纯PHP来获取请求体。

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

我有同样的问题,但我找到了解决方案。

这是我发送的Json [{"name":"JOSE ANGEL", "lastname":"Ramirez"}]

 $data = json_decode(file_get_contents('php://input'), true); echo json_encode($data); 

此代码已经过测试,结果为[{"name":"JOSE ANGEL","lastname":"Ramirez"}]