的file_get_contents(' PHP://输入&#39);与application / x-www-form-urlencoded;

时间:2014-09-19 15:47:50

标签: javascript php jquery

我在这里已经阅读了一些关于这个主题的问题,但找不到我正在寻找的答案。 我正在使用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

3 个答案:

答案 0 :(得分:7)

按原样在请求的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);

可以获得更多信息in the PHP documentation on type casting

答案 1 :(得分:6)

为了发送原始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);

答案 2 :(得分:1)

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