为什么我无法访问我的codeigniter应用程序POST的json数据?

时间:2012-10-04 16:29:29

标签: json codeigniter rest post curl

我正在使用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变量访问数据,它没有任何区别。

2 个答案:

答案 0 :(得分:4)

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

var_dump($HTTP_RAW_POST_DATA);

甚至更好

var_dump(file_get_contents("php://input")); 

答案 1 :(得分:2)

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

  1. 将文件MY_Input.php添加到application / core
  2. 在此文件中添加代码:
  3. 
    
    <?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;
    &#13;
    &#13;

    那是......

    像普通邮件一样使用..