在PHP中解析JavaScript的fetch请求

17

我正在通过Javascript调用一项POST请求,以下是它的样子:

function syncDeviceId(deviceID, mod){
  var request = new Request('url', {
    method: 'POST',
    body: JSON.stringify({
        uuid: unique_id,
    }),
    mode: 'cors'
  })

  fetch(request).then(function(data) {
    return
  })

我正在尝试像这样检索值,

<?php

$post['uuid'] = $_POST['uuid']; 

?>

这将作为空返回,我如何从PHP的fetch post请求中检索值。谢谢。


1
你的 PHP 代码没有问题。在浏览器的调试工具中,实际的网络请求是什么样子的? - thatidiotguy
你尝试过什么来调试这个问题?你检查了请求是否正确发送了吗? - Nico Haase
3个回答

20
这是因为您没有将请求的正文设置为正确的格式。

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();
//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);

你提到的最后一个方法对我来说总是返回一个空字符串。 - Lonnie Best
1
@LonnieBest,如果file_get_contents('php://input')返回一个空字符串,则您的POST请求没有发送请求正文。 - Patrick Evans

4

我也遇到了同样的问题。

我首先使用Chrome调试工具确保我传递了请求体(Chrome调试工具会将其称为“请求有效载荷”)。

我发送的内容是:

{ClientDomain: "example.com"}

我随后在我的接收PHP脚本中使用了上述代码。
$json = file_get_contents('php://input');
$data = json_decode($json);

然后,将我的JSON代码放入一个数组中,在PHP中可以读取该数组。
PRINT $data["ClientDomain"];

我希望这能帮助到下一个人。


-1

你需要回显你的结果,这样它才会在请求体中返回:

<?php

$post['uuid'] = $_POST['uuid']; 
echo $post['uuid'];
?>

此外,看起来您需要使用调用的php脚本的url实例化请求对象:

var request = new Request('my_script.php', { . . .

无论您的php脚本在哪里。


1
我使用了print_r,结果是Array ( [uuid] => ) - rksh
1
如果这是你的代码,你需要将你的请求传递给 'url'。那应该是你实际调用的php脚本。我会根据这个修改我的答案。 - eggmatters
这是一个 PHP 脚本,我刚刚删除了真实的 URL 并用 'url' 替换了它。 - rksh
我假设您已经替换了它以发布此问题。既然您正在回显结果,让我们假设您正在获得200响应。print_r($_POST)的输出是什么?承诺回调中data参数的结构是什么? - eggmatters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接