PHP的$_POST为空,但HTTP_RAW_POST_DATA有所有数据

5

我只是想使用JS向服务器发送一个POST请求。但是,服务器上的$_POST数组为空。我可以使用HTTP_RAW_POST_DATA,但它将在PHP 5.6中被弃用。我能否将发布的数据放入我的$_POST数组中?

环境:Chrome,apache2,PHP,AngularJS(我正在使用$http.post函数)。

调试图像(抱歉没有直接附加图像 - 我没有10个声望)


1
尝试在 $http.post 中添加头部:{'Content-Type': 'application/x-www-form-urlencoded'}。 - Matt Burrow
请查看我的调试图像获取代码。我尝试过{'Content-Type': 'application/x-www-form-urlencoded'},但是在这种情况下服务器既没有$_POST也没有HTTP_RAW_POST_DATA - Black Akula
4个回答

10

为了正确解码,POST数据必须采用查询字符串multipart/form-data格式。您的数据似乎是JSON格式,因此您需要自己进行解码:

$_POST = json_decode(file_get_contents('php://input'), true);

1
虽然,为了像 $_POST 一样准确地使用它,我们应该将 true 作为第二个参数添加到 json_decode 中,以便它返回一个数组。 $_POST = json_decode(file_get_contents('php://input'), true); - SuperNOVA
你说得对。感谢您的评论。答案已经编辑过了。 - BreyndotEchse

4

$_POST是由类型为form-urlencodedmultipart/form-data的请求填充的。通常它看起来像这样:

foo=bar&ipsum=lorm

就像发起一个 GET 请求一样。

既然您直接发布JSON(这很棒!),可以使用以下代码:

$request_payload = file_get_contents("php://input");

请见文档以了解更多信息。


直接发布JSON的原因是什么?(纯属好奇,无冒犯之意) - Attila Fulop
1
因为在JSON数据上使用表单编码存在问题。具体而言,空值不会被传输。{"foo":[],"bar:"baz"}将只得到bar=baz。表单编码无法指定一个空数组。 - Halcyon
1
一个缺失的空数组可能看起来不像是一个问题,因为你可以将其作为默认值添加。但是,如果你有:{foo:[[],[]]} 表单编码会给出一个空结果。我认为这是一个问题。 - Halcyon

3
默认情况下,jQuery使用Content-Type: x-www-form-urlencoded和熟悉的foo=bar&baz=moe序列化方式传输数据。然而,AngularJS使用Content-Type: application/json{"foo": "bar", "baz": "moe"} JSON序列化方式传输数据,不幸的是一些Web服务器语言(尤其是PHP)不能原生反序列化JSON数据。
因此,在定义您的Angular模块时,您可以这样做:
angular.module('MyModule', [], function($httpProvider) {
    // Use x-www-form-urlencoded Content-Type
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
});

以下答案摘自Felipe Miosso的帖子.


是的,它正在工作。但我不知道为什么在$http.post(filtersUrl, data, {headers: {'Content-Type': 'application/json; charset=utf-8'})中直接设置'Content-Type'不起作用... 我已经使用了$http.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8',它也可以正常工作。 - Black Akula
$http.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8' 这样做的效果是一样的,但是按照建议提供可以在整个应用程序中使用。 - Jai
是的,在这种情况下,我需要在我的服务器上执行 json_decode(file_get_contents('php://input')); - Black Akula

0

看起来是直接发布 JSON 数据,没有任何变量,请尝试使用

$request = file_get_contents('php://input');
print_r($request);

或者在发布数据时使用变量

data{'myvar': data}

并且会获得POST数据,例如:

print_r($_POST['myvar']);

两者都不起作用: 1)file_get_contents("php://input") 返回空字符串; 2){'myvar': data} 的结果与原始的POST数据相同($_POST为空)。 - Black Akula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接