【问题标题】:Javascript fetch api payload not deliveredJavascript 获取 api 有效负载未交付
【发布时间】:2020-03-09 17:25:29
【问题描述】:
console.log("data ", data); // returns an object in JSON format {propertyName: propertyValue}
dataString = JSON.stringify(dataString); //correctly stringified json

let response = await fetch('updateRecevingEntry.php', 
                {
                method:'POST',
                headers: {'Content-Type':'application/json'}, 
                body: dataString
            }).then(response=>response.json()); 

但是我在 php 端返回了一个未定义的索引。

php 在哪里:

$matkey = $_POST['materialKey'];

返回

<b>Notice</b>:  Undefined index: materialKey in <b>path/updateRecevingEntry.php</b> on line <b>3</b><br />

对于所有数据...没有一个被捕获。

那么为什么 _POST['propertyName'] 没有从正文中捕获 stringData?

我尝试了一些变体,例如发送数据而不是与标头混淆的字符串数据,但我似乎无法弄清楚如何发送有效负载以便 _POST['propertyName'] 捕获正文中的数据。

我之前使用的是 jquery 中的 $.ajax,它正在工作:但我正在重构它。

Fetch api 对我来说是新的。我哪里错了。我也不想在php端解析一个json对象。

在阅读了其中一个答案后,我得到了它在一种情况下的工作, 但是

        let response = await fetch('updateRecevingEntry.php', 
                {
                method:'POST',
                headers: {'Content-Type':'application/json'}, 
                body: sendData  
            }).then(response=>response.json()); 

和php

$postData = json_decode(file_get_contents("php://input"), true);
var_dump($postData);

只返回一个大的 NULL。

编辑二:结果它实际上只需要通过 JSON.stringify(sendData) 进行编码。自从。它按预期工作。

【问题讨论】:

  • var_dump($_POST); 很可能是json_encoded,在这种情况下你需要先解码
  • 复制,这就是我要避免的,无论如何要正确发送它,这样我就不会在 php 方面解析 json 对象?
  • JSON.stringify 是您对其进行编码的位置。尝试在没有那个的情况下发送它。

标签: javascript php json post fetch


【解决方案1】:

我注意到的第一件事是您没有使用正确的变量(您使用的是stringData 而不是dataString):

dataString = JSON.stringify(dataString); //correctly stringified json

let response = await fetch('updateRecevingEntry.php', {
    method:'POST',
    headers: {'Content-Type':'application/json'}, 
    body: dataString    
}).then(response=>response.json());

虽然您不需要在使用 json 标头发送它时对其进行字符串化。


另外,你有没有试过用php://input代替$_POST

来自PHP.net

php://input 是一个只读流,允许您从请求正文中读取原始数据。对于 POST 请求,最好使用 php://input 而不是 $HTTP_RAW_POST_DATA,因为它不依赖于特殊的 php.ini 指令。此外,对于那些默认情况下不填充 $HTTP_RAW_POST_DATA 的情况,与激活 always_populate_raw_post_data 相比,它可能是一种内存密集度较低的替代方案。 php://input 不适用于 enctype="multipart/form-data"。

所以你会这样使用它:

$postData = json_decode(file_get_contents("php://input"), true);
$matkey = $postData['materialKey'];

这会将 POST 请求的主体读取为 JSON 字符串,然后将其转换为 PHP 数组。

【讨论】:

  • 是的,错字是发到这里的,我现在要改正。
  • 行得通。当它使用 json_decode 时,它​​会做。但是如何编写一个获取请求,以便您可以发送一个对象并让它正确填充_POST['propertyName']?
  • 为了使 $_POST 工作,数据需要以FormData 而不是JSON 发送,但我不明白为什么你会在 php:// 时需要 $_POST输入给你同样的结果。如果答案有效,请随时将其标记为已接受的答案:)
猜你喜欢
  • 1970-01-01
  • 2017-06-28
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多