我只是想使用JS向服务器发送一个POST
请求。但是,服务器上的$_POST
数组为空。我可以使用HTTP_RAW_POST_DATA
,但它将在PHP 5.6中被弃用。我能否将发布的数据放入我的$_POST
数组中?
环境:Chrome,apache2,PHP,AngularJS(我正在使用$http.post
函数)。
调试图像(抱歉没有直接附加图像 - 我没有10个声望)
为了正确解码,POST数据必须采用查询字符串或multipart/form-data格式。您的数据似乎是JSON格式,因此您需要自己进行解码:
$_POST = json_decode(file_get_contents('php://input'), true);
$_POST
是由类型为form-urlencoded
或multipart/form-data
的请求填充的。通常它看起来像这样:
foo=bar&ipsum=lorm
就像发起一个 GET
请求一样。
既然您直接发布JSON(这很棒!),可以使用以下代码:
$request_payload = file_get_contents("php://input");
请见文档以了解更多信息。
{"foo":[],"bar:"baz"}
将只得到bar=baz
。表单编码无法指定一个空数组。 - Halcyon{foo:[[],[]]}
表单编码会给出一个空结果。我认为这是一个问题。 - HalcyonContent-Type: x-www-form-urlencoded
和熟悉的foo=bar&baz=moe
序列化方式传输数据。然而,AngularJS使用Content-Type: application/json
和{"foo": "bar", "baz": "moe"}
JSON序列化方式传输数据,不幸的是一些Web服务器语言(尤其是PHP)不能原生反序列化JSON数据。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'
这样做的效果是一样的,但是按照建议提供可以在整个应用程序中使用。 - Jaijson_decode(file_get_contents('php://input'));
。 - Black Akula看起来是直接发布 JSON 数据,没有任何变量,请尝试使用
$request = file_get_contents('php://input');
print_r($request);
或者在发布数据时使用变量
data{'myvar': data}
并且会获得POST数据,例如:
print_r($_POST['myvar']);
file_get_contents("php://input")
返回空字符串;
2){'myvar': data}
的结果与原始的POST数据相同($_POST
为空)。 - Black Akula
{'Content-Type': 'application/x-www-form-urlencoded'}
,但是在这种情况下服务器既没有$_POST
也没有HTTP_RAW_POST_DATA
。 - Black Akula