这是因为您没有将Request 的正文设置为正确的格式。
https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#Parameters
body:您想添加到请求中的任何正文:这可以是
Blob、BufferSource、FormData、URLSearchParams 或 USVString 对象。
请注意,使用 GET 或 HEAD 方法的请求不能有正文。
The content-type header is based on the object set to body, or to the Content-Type specified in a Header object if supplied.
因此,将 body 设置为 JSON 字符串会使 content-type 标头为 text/plain。即使您将请求 Content-Type 设置为 application/json 也没关系,因为默认情况下 PHP 不知道如何解析传入的 JSON 请求负载(除非它是最近在 PHP 7 中添加的)。
你可以在客户端做一些事情
从您的对象创建一个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 对象,它将内容类型设置为application/x-www-form-urlencoded。注意:URLSearchParams 没有被广泛支持
//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"
});
创建一个查询字符串(即a=hello&b=world)并使用Headers 对象将Content-Type 设置为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);