这是因为您没有将请求的正文设置为正确的格式。
https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#Parameters
body:要添加到请求中的任何正文:这可以是 Blob、BufferSource、FormData、URLSearchParams 或 USVString 对象。请注意,使用 GET 或 HEAD 方法的请求不能具有正文。
内容类型标头基于设置为 body
的对象,或设置为 Header 对象中指定的内容类型(如果提供)。
因此,将 body 设置为 JSON 字符串会使内容类型标头为 。即使您将请求 Content-Type 设置为 Content-Type 也无关紧要,因为 PHP 默认情况下不知道如何解析传入的 JSON 请求有效负载(除非它是最近在 PHP 7 中添加的)。text/plain
application/json
客户端可以执行一些操作
从您的对象创建一个 FormData 对象,并将其用作正文,将使用内容类型multipart/form
var data = {some:"data",even:"more"};
var fd = new FormData();
//very simply, doesn't handle complete objects
for(var i in data){
fd.append(i,data[i]);
}
var req = new Request("url",{
method:"POST",
body:fd,
mode:"cors"
});
创建一个 URLSearchParams 对象,该对象将内容类型设置为 。注意:URLSearchParams 未得到广泛支持application/x-www-form-urlencoded
//Similar to creating a simple FormData object
var data = {some:"data",even:"more"};
var params = new URLSearchParams();
for(i in data){
params.append(i,data[i]);
}
var req = new Request("url",{
method:"POST",
body:params,
mode:"cors"
});
创建查询字符串 (ie ),并使用 Headers 对象将 Content-Type 设置为a=hello&b=world
application/x-form-urlencoded
var data = {some:"data",even:"more"};
var headers = new Headers({
"Content-Type":"application/x-form-urlencoded"
});
var params = [];
for(i in data){
params.push(i + "=" + encodeURIComponent(data[i]));
}
var req = new Request("url",{
method:"POST",
body:params.join("&"),
headers:headers,
mode:"cors"
});
如果您仍然想发送JSON有效负载而不是执行上述操作,则可以,但是您必须读取原始请求输入,然后使用json_decode来获取数据
$json = file_get_contents('php://input');
$data = json_decode($json);