【发布时间】:2021-04-05 11:10:42
【问题描述】:
我正在尝试从一些代码中删除 jQuery。我只将它用于 POST 操作,所以我想删除它并使用 fetch() 代替。但我无法让 fetch() 使用相同的数据工作。 php文件工作正常,只是没有接收到数据
这将为以下两个测试用例设置测试数据:
var toPostObj = new(Object);
toPostObj.action = "update+file";
toPostObj.arrays = [["2020-12-28", "23:20:56", "Trying from ztest", "9.jpg"]];
这可以使用 jQuery:
$.post('toMariaDB.php', { // url
data: toPostObj
}, function(data2, status, jqXHR) {
console.log ("data2",data2);
});
这在使用 fetch() 时不起作用:
fetch("toMariaDB.php", {
method: "POST",
body: toPostObj, // using JSON.stringify(toPostObj) also doesn't work
headers: { "Content-type": "application/text; charset=UTF-8" }
})
.then(response => response.text())
.then(text => console.log(text))//;
.catch(error => {
console.error(error)
})
出于调试目的,toMariaDB.php 将其接收的数据和来自 toMariaDB 的任何其他消息写出一个日志文件。
运行 jQuery 代码会将其写入日志文件:
toMariaDB: I've ARRIVED
in toMariaDB 1=>Array
(
[action] => update+file
[arrays] => Array
(
[0] => Array
(
[0] => 2020-12-28
[1] => 23:20:56
[2] => Trying from ztest
[3] => 9.jpg
)
)
)
这是 toMariaDB.php 所期望的。
但是 fetch() 版本是这样写的:
toMariaDB: I've ARRIVED
in toMariaDB 1=>
无论我使用 fetch() 的结果都是一样的
body: toPostObj,
或
body: JSON.stringify(toPostObj),
我用过
headers: { "Content-type": "application/text; charset=UTF-8" }
因为 toMariaDB.php 返回文本,据我了解,标题描述了返回的内容
但以防万一我误解了,我尝试了
headers: { "Content-type": "application/json; charset=UTF-8" }
也一样,但这也没用。
如何格式化正文,使其以与 jQuery 相同的形式到达 toMariaDB.php?即
toPostObj.action = "update+file";
toPostObj.arrays = [["2020-12-28", "23:20:56", "Trying from ztest", "9.jpg"]];
感谢您的帮助。
编辑
正如@T.J.Crowder 所建议的,(感谢您指点我)这是使用 jQuery 运行时“网络”选项卡显示为“请求有效负载”的内容:
data[action]: update+file
data[arrays][0][]: 2020-12-28
data[arrays][0][]: 23:20:56
data[arrays][0][]: Trying from ztest
data[arrays][0][]: 9.jpg
我不明白为什么这些不显示为 data[arrays][0][0] 等,但它有效。
(这是一个二维数组,因为 toMariaDB.php 必须能够处理多个数组。)
使用 fetch(),Network 选项卡 Request Payload 显示:
[object Object]
【问题讨论】:
-
请在浏览器中打开“网络”选项卡,运行 jQuery 代码,找到正在发送的 POST 正文,然后将其复制并粘贴到问题中。
-
附注,FWIW:
var toPostObj = new(Object);是一种非常不寻常的写var toPostObj = new Object;的方式,这反过来又有点不寻常(但完全有效)写var toPostObj = new Object();的方式,通常最好写var toPostObj = {}; -
谢谢,@T.J. Crowder,为 cmets 制作新物体。从 stackoverflow 或其他地方复制一些其他代码时,我选择了 new(Object) 样式。当我通过 var arr = []; 创建一个新数组时你的观察很有意义。我会记住的。
标签: javascript php jquery fetch-api