在 PHP 中解析 Javascript fetch

2022-08-30 23:27:35

我通过Javascript调用帖子请求,这是它的外观,

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的抓取后请求中检索值。谢谢


答案 1

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

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/plainapplication/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=worldapplication/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);

答案 2

我也遇到了同样的问题。

我首先使用Chrome调试工具来确保我正在传递我正在发送的请求正文(chrome调试将称之为“请求有效负载”)

{ClientDomain: "example.com"}

然后,我在接收PHP脚本中使用了所述代码。

$json = file_get_contents('php://input');
$data = json_decode($json);

然后将我的JSON代码放入一个数组中,然后我可以在PHP中读取。

PRINT $data["ClientDomain"];

我希望这对下一个人有所帮助。