就MDN而言,通过提取和发送数据进行POST请求的正确方法是:(https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)
var url = 'https://example.com/profile';
var data = {username: 'example'};
fetch(url, {
method: 'POST', // or 'PUT'
body: JSON.stringify(data), // data can be `string` or {object}!
headers:{
'Content-Type': 'application/json'
}
}).then(res => res.json())
.then(response => console.log('Success:', JSON.stringify(response)))
.catch(error => console.error('Error:', error));
但是我花了2天的时间尝试使其正常运行(Chrome,Firefox,Edge),但是我无法...问题是正文没有发送到服务器(GET请求正常),不是服务器问题,(我在同一台计算机上使用的是PHP 7),我调试了请求,并且没有任何正文内容发送到服务器...
最后,在两个朋友的帮助下,我们意识到发送正文不是使用其他标头和其他正文格式。这些是我有效的测试文件:
<body>
<button onclick='buttonOneClick()'>One (GET)</button>
<button onclick='buttonTwoClick()'>Two (POST)</button>
<script>
function buttonOneClick(){
fetch('server.php?text=one&id=1')
.then(r => r.text())
.then(res => alert('you sent '+res));
}
function buttonTwoClick(){
let data = "text=two&id=1";
fetch('server.php', {
method: 'POST',
body: data,
headers: {
'Content-Type':'application/x-www-form-urlencoded',
},
})
.then(r => r.text())
.then(res => alert('you sent '+res));
}
</script>
</body>
和服务器文件,在PHP中:
<?php
$param = $_REQUEST['text'] ?? "nothing";
print $param;
我必须使用“ application / x-www-form-urlencoded”代替“ application / json”内容类型标头,并为“ body”属性使用字符串。
这是在获取POST请求中发送“正文”的唯一方式... 是的,当我使用“ application / json”标头和JSON.stringify作为正文时,我尝试使用许多属性,例如“ mode”,“ cache”,“ credentials” ...和“ POST”和/或小写的“ Content-Type” ...以及json数据中的简单和双引号...但没有用
答案 0 :(得分:0)
JSON主体不是$ _POST那样的PHP afaik中的常规数据。您应该可以使用此代码段来读取json。
// Get JSON as a string
$json_str = file_get_contents('php://input');
// Get as an object
$json_obj = json_decode($json_str);
答案 1 :(得分:0)
这是因为API正在使用application/x-www-form-urlencoded
接受数据并验证其是否以该格式发送。因此标头应位于application/x-www-form-urlencoded
中。如果您正在编写API,请更改API,使其仅接受application/json
,然后它将为您提供所需的结果。