的file_get_contents( ‘PHP://输入’); 与application / x-www-form-urlencoded;

我在这里读了几个关于这个问题的问题,但找不到我想要的答案。 我正在使用jQuery向PHP5.6服务器做一些$ .post。

$.post('/', {a:100, b:'test'}, function(data){ }, 'json'); 

控制台的编码是

 Content-Type application/x-www-form-urlencoded; charset=UTF-8 

如果我尝试使用常规$ _POST读取POST数据,PHP5.6会提醒我

 PHP Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead 

那么我已经尝试了这个建议,在php.ini中添加了always_populate_raw_post_data = -1

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

PHP5.6警告我它无效

 PHP Warning: First parameter must either be an object or the name of an existing class 

所以我转储了file_get_contents(“php:// input”)并且它是一个字符串。

 a=100&b="test" 

所以我解析了字符串并编码然后解码

 parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data)); var_dump($data); 

然后,我最终将我的$ data作为对象而不是数组,作为真正的JSON对象。

我现在暂时继续使用$ _POST …但后来我想知道升级PHP ..

这里的问题是,是否有一个更直接的解决方案,或者它是否意味着使用file_get_contents(“php:// input”)也意味着进行解析解码编码恶作剧?

编辑:所以看起来这在多级json上都不起作用。 考虑以下:

 {"a":100, "b":{"c":"test"}} 

正如在Ajax / Post中发送的那样

 {a:100, b:{c:"test"}} 

 parse_str(file_get_contents("php://input"), $post); var_dump($post); 

会输出

 array(2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}" } 

或做(如建议)

 parse_str(file_get_contents("php://input"), $post); $post= (object)$post; 

会输出

 object(stdClass)#11 (2) { ["a"]=>string(8) "100" ["b"]=>string(16) "{"c":"test"}" 

}

如何在不使用递归函数的情况下将file_get_contents(“php:// input”)转换为具有相同“架构”的真实对象?

编辑2:我的错误,建议工作,我在JSON.stringify的评论中跟踪导致错误。 底线:它适用于json_decode(json_encode($ post))或$ post =(object)$ post;

回顾一下,使用jQuery $ .post:

 $.post('/', {a:100, b:{c:'test'}}, function(data){ }, 'json'); parse_str(file_get_contents("php://input"), $data); $data = json_decode(json_encode($data)); 

要么

 parse_str(file_get_contents("php://input"), $data); $data= (object)$data; 

无需使用JSON.stringify

按原样在请求的POST主体中接收序列化/ urlencoded POST数据,您已经正确地将其转换为具有parse_str()的数组。

但是,编码然后解码JSON以便将其转换为您正在寻找的对象 (而不是数组 )的步骤是不必要的。 相反,PHP会愉快地将关联数组转换为类stdClass的对象:

 parse_str(file_get_contents("php://input"), $data); // Cast it to an object $data = (object)$data; var_dump($data); 

有关类型转换的PHP文档中提供了更多信息。

为了发送原始的json数据,你必须从url-encoding中停止jQuery:

  data = {"a":"test", "b":{"c":123}}; $.ajax({ type: 'POST', url: '...', data: JSON.stringify(data), // I encode it myself processData: false // please, jQuery, don't bother }); 

在php方面,只需读取php://inputjson_decode

 $req = file_get_contents("php://input"); $req = json_decode($req); 

我的错误,建议工作,我在JSON.stringify的评论中跟踪导致错误。 底线:它适用于json_decode(json_encode($ post))或$ post =(object)$ post; 迈克尔给出的答案是正确的,但是我跟踪了我,我在代码中留下了错误。 JSON.stringify仅在我在评论中回复时从表单发布数据时才有用。