这是因为您没有将
请求的正文设置为正确的格式。
https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#Parameters
body:您想添加到请求中的任何正文:可以是Blob、BufferSource、FormData、URLSearchParams或USVString对象。请注意,使用GET或HEAD方法的请求不能有正文。
Content-Type标头基于设置为body
的对象,或者基于提供的Header对象中指定的Content-Type。
因此,将正文设置为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();
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并不被广泛支持。
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);