我正在使用以下结构构建API:
POST
/words
。 {"word":"example"}
。此请求应该向数据库添加单词,如果我通过httpie
进行测试,一切正常。
$ http POST localhost:8000/words word="new word2"
HTTP/1.1 200 OK
Access-Control-Allow-Headers: application/json
Access-Control-Allow-Origin: http://localhost:8080
Connection: close
Content-Type: application/json
Host: localhost:8000
X-Powered-By: PHP/7.0.12-1+deb.sury.org~xenial+1
{
"test": {
"method": "POST",
"input": {
"word": "new word2"
},
"post": []
},
"words": {
"id": "581f2f118b0414307476f7b3",
"word": "new word2"
}
}
在test
中,我将php
中获得的变量放在:
$method = $_SERVER['REQUEST_METHOD'];
$input = json_decode(file_get_contents('php://input'),true);
$post = $_POST;
我们可以看到$_POST
为空。如果我使用javascript:
$(form).submit(function(e) {
var url = "http://localhost:8000/words";
var data = {"word" : form.elements["word"].value };
$.ajax({
type: "POST",
url: url,
data: data,
dataType: 'json',
success: function(data)
{
console.log(JSON.stringify(data));
}
});
e.preventDefault();
});
我获得以下控制台日志:
{
"test":{
"method":"POST",
"input":null,
"post":{
"word":"word from form"
}
},
"words":{
"id":"581f34b28b0414307476f7b6",
"word":null
}
}
现在input
为空。 Word为空,因为我正在处理来自$input["word"]
的{{1}}。我的问题:
php://input
,还是检查两个变量? $_POST
,还是从命令行收费php://input
发送$_POST
?答案 0 :(得分:1)
您手动构建的示例和JavaScript示例不等效。
首先,您使用application / json内容类型发送JSON编码数据。
在第二种情况下,您将JavaScript对象传递给jQuery,并允许它遵循它的默认行为,即使用application / x-www-form-urlencoded格式对其进行编码,并将其用作内容类型(就像提交常规HTML表单一样)。
PHP支持POST请求中的application / x-www-form-urlencoded数据,但不支持JSON。
我应该处理$ _POST,还是检查两个变量?
如果您要发送application / x-www-form-urlencoded数据或PHP支持的其他格式,请使用$_POST
。否则,您需要从php://input
获取原始数据并自行解析。
我可以从浏览器发送php://输入
$ _ POST命令行收费如httpie?
http --form POST api.example.org/person/1 name='John Smith'