8

php://input在本地主机中正常工作。但在服务器中它返回空。我网站的输入(请求)是jsonREST-应用程序/json 类型),所以$_POST没有用(请阅读这个问题)。

$_POST 适用于 key-value 对类型的输入,如 form-data 或 x-www-urlencoded

键1=值1&键2=值2&键3=值3

application/json用作输入(在REST中)。

比如 {'key1':'value1','key2':'value2','key3':'value3'}

这无法使用$_POST. 但是使用php://input可以帮助读取该数据。

我的代码

class Webservice_Controller extends CI_Controller {
    public $json_input_data;
    public function __construct(){
        parent::__construct();
        $this->json_input_data = json_decode(file_get_contents('php://input'),TRUE);
    }
    public function json_input($label){
        if(isset($this->json_input_data[$label])) return $this->json_input_data[$label];
        else return NULL;
    }
}

上面的代码在另一个网络服务器中也可以正常工作,但在当前的网络服务器中不行。:(

我认为我的网络服务器拒绝访问php://input.

还有其他方法可以在 php 中读取 json 输入吗?

4

2 回答 2

4

我知道这是旧的,但它可能会帮助其他人:

小心你的json中的单引号

来自关于 json_decode 的 PHP 文档:

the name and value must be enclosed in double quotes
single quotes are not valid 

$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
于 2014-04-01T01:54:48.737 回答
4

php://input 是一个只读流,允许您从请求正文中读取原始数据。对于 POST 请求,最好使用 php://input 而不是 $HTTP_RAW_POST_DATA,因为它不依赖于特殊的 php.ini 指令。此外,对于那些默认情况下不填充 $HTTP_RAW_POST_DATA 的情况,与激活 always_populate_raw_post_data 相比,它可能是一种内存密集度较低的替代方案。php://input不适用于 enctype="multipart/form-data"

包装

也试试这个

....
  public function __construct(){
    parent::__construct();
    if(isset($_POST))
    {
       var_dump(file_get_contents('php://input'));
       $this->json_input_data=json_decode(file_get_contents('php://input'),TRUE);
    }
    else echo 'Not Post';
  }
....

还要检查allow_url_fopen.

于 2013-08-22T04:45:52.597 回答