3

我正在使用 CodeIgniter 开发一个 RESTful 应用程序,但我无法在我的控制器中访问我的 POST'd 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 数据时,我始终会bool(FALSE)从 index 函数的 POST 部分返回。这是我正在发出的 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(),没有它就无法正常工作。据我了解,排除参数 from$this->input->post()将返回所有帖子项目,但我仍然没有得到任何内容。我也试过绕过 CI 的输入库并通过 PHP 的$_POST变量访问数据,它没有任何区别。

4

2 回答 2

5

您的帖子数据不是查询字符串格式,因此您应该跳过处理 $_POST 并直接转到原始帖子数据。

尝试

var_dump($HTTP_RAW_POST_DATA);

甚至更好

var_dump(file_get_contents("php://input")); 
于 2012-10-04T20:17:55.503 回答
2

在 codeigniter 2.X 中,您可以覆盖 Input 类并添加必要的功能。 https://ellislab.com/codeigniter/user-guide/general/core_classes.html

  1. 将文件 MY_Input.php 添加到 application/core
  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);
    }
}

就是这样..

像普通帖子一样使用它..

于 2015-02-01T12:09:18.460 回答