我正在使用CodeIgniter处理RESTful应用程序,但我无法在控制器中访问POST的json数据。
我在本地计算机上通过cURL发布json,而应用程序正在远程服务器上开发。
以下是有问题的控制器代码:
class Products extends CI_Controller
{
public function __construct()
{
$this->load->model(products_model);
}
public function index($id = FALSE)
{
if($_SERVER['REQUEST_METHOD'] == 'GET')
{
// fetch product data
$product_data = $this->products_model->get_products($id)
// set appropriate header, output json
$this->output
->set_content_type(application/json)
->set_output(json_encode($product_data));
}
elseif($_SERVER['REQUEST_METHOD'] == 'POST')
{
// debugging for now, just dump the post data
var_dump($this->input->post());
}
}
}
GET操作运行良好,并在从浏览器请求时或通过cURL请求返回适当的数据。但是,当尝试通过cURL POST json数据时,我始终从索引函数的POST部分返回bool(FALSE)
。这是我正在制作的cURL请求:
curl -X POST -d @product.json mydomain.com/restfulservice/products
此外,这是product.json文件的内容:
{"id":"240",
"name":"4 x 6 Print",
"cost":"1.5900",
"minResolution":401,
"unitOfMeasure":"in",
"dimX":0,
"dimY":0,
"height":4,
"width":6}
我通过cURL进行了另一次POST,排除了json数据并传递了这样的内容:
curl -X POST -d '&this=that' mydomain.com/restfulservice/products
返回
array(1) {
["this"]=>
string(4) "that"
}
是什么给出的?与json有什么关系?这是有效的。我已经关闭了application / config / config.php中的全局CSRF和XSS,因为据我所知他们需要使用CI的form_open()
,如果没有它,它将无法正常工作。我的理解是,从$this->input->post()
中排除参数将返回所有的帖子项,但我仍然没有。我也试过绕过CI的输入库并通过PHP的$_POST
变量访问数据,它没有任何区别。
答案 0 :(得分:4)
您的帖子数据不是查询字符串格式,因此您应该跳过处理$ _POST并直接转到原始帖子数据。
试
var_dump($HTTP_RAW_POST_DATA);
甚至更好
var_dump(file_get_contents("php://input"));
答案 1 :(得分:2)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Input extends CI_Input {
public function raw_post() {
return file_get_contents('php://input');
}
public function post($index = NULL, $xss_clean = FALSE) {
$content_type = $this->get_request_header('Content-type');
if (stripos($content_type, 'application/json') !== FALSE
&& ($postdata = $this->raw_post())
&& in_array($postdata[0], array('{', '['))) {
$decoded_postdata = json_decode($postdata, true);
if ((json_last_error() == JSON_ERROR_NONE))
$_POST = $decoded_postdata;
}
return parent::post($index, $xss_clean);
}
}
&#13;
那是......
像普通邮件一样使用..