【问题标题】:Parse Javascript fetch in PHP在 PHP 中解析 Javascript 获取
【发布时间】:2016-05-07 14:46:09
【问题描述】:

我正在通过 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 中的 fetch post 请求中检索值。谢谢

【问题讨论】:

  • 您的 PHP 代码没有问题。在浏览器的调试工具中,实际的网络请求是什么样的?
  • 您尝试过什么调试问题?您是否检查了请求是否正常发出?

标签: javascript php


【解决方案1】:

这是因为您没有将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&amp;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);

【讨论】:

  • 你提到的最后一个方法总是为我返回一个空字符串。
  • @LonnieBest,如果 file_get_contents('php://input') 返回一个空字符串,那么您的 POST 请求没有发送请求正文
【解决方案2】:

我也遇到了同样的问题。

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

{ClientDomain: "example.com"}

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

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

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

PRINT $data["ClientDomain"];

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

【讨论】:

    【解决方案3】:

    您需要回显您的结果,因此它将在您的请求正文中返回:

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

    此外,您似乎需要使用您正在调用的 php 脚本的 url 实例化您的请求对象:

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

    无论你的 php 脚本在哪里。

    【讨论】:

    • 好吧,我使用了 print_r,结果是 Array ( [uuid] => )
    • 如果上面的代码是您的代码,您将请求传递给“url”。那必须是您实际调用的 php 脚本。我会修改我的答案。
    • 这是一个php脚本,我只是删除了真正的url并用'url'替换它
    • 我假设您为了发布这个问题而更换了它。因为,您正在回显结果,所以我们假设您收到 200 个响应。 print_r($_POST) 的输出是什么?承诺回调中 data 参数的结构是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2011-04-22
    • 2011-03-14
    • 2011-06-17
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多