javascript - Ajax 的数据和 fetch API 的主体有什么区别?
问题描述
来自 jQuery 的 ajax 函数
$.ajax({
method: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
})
.done(function( msg ) {
console.log( "Data Saved: " + msg );
});
这是一个使用 fetch API 的请求
const data = { name: "John", data: "Boston" };
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: data,
};
const response = await fetch('/api ',options);
const responseData = await response.json();
console.log(responseData);
另外,这个 fetch 实现如何在我的节点终端中产生错误?
例如,如果我使用数字而不是 'Boston' ,则 Unexpected 标记更改为 '<' 。
SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
这两者之间有什么我需要注意的吗?
ajax
的数据和fetch的主体?
(我没有同时使用它们)
解决方案
从文档中我们可以看到...
当 data 是一个对象时,jQuery 从对象的键/值对生成数据字符串,除非该
processData
选项设置为 false。例如,{ a: "bc", d: "e,f" }
被转换为字符串"a=bc&d=e%2Cf"
。如果 value 是一个数组,jQuery 会根据传统设置的 value 序列化具有相同 key 的多个值(如下所述)。例如,{ a: [1,2] }
成为"a%5B%5D=1&a%5B%5D=2"
具有默认traditional: false
设置的字符串。
fetch
不这样做。但是另外,您已经说过您通过包含Content-Type: application/json
作为标头来发送 JSON,但您没有这样做(并且您的 jQuery 代码也不这样做,它发送 URI 编码的数据)。
你必须自己做。如果要发送 JSON,请使用JSON.stringify
:
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
};
如果要发送 URI 编码的数据,请使用URLSearchParams
:
const data = new URLSearchParams([ // Note this is an array of
["name", "John"], // [name, value] arrays
["data", "Boston"],
]);
const options = {
method: 'POST',
body: data,
};
如果要发送标准格式编码,请使用FormData
( 与上面完全相同,但FormData
使用URLSearchParams
.
另外,这个 fetch 实现如何在我的节点终端中产生错误?例如,如果我使用数字而不是 'Boston' ,则 Unexpected 标记更改为 '<' 。
SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>)
因为您的对象被强制转换为字符串,并且它被强制转换"[object Object]"
为 ,从o
.
旁注:您的fetch
代码正在成为 API 中的猎物:fetch
仅拒绝其对网络错误的承诺,而不是 HTTP 错误。你不能假设一个已经履行的承诺fetch
意味着你的请求是成功的,你必须检查:
const response = await fetch('/api ',options);
if (!response.ok) {
throw new Error("HTTP error " + response.status);
}
const responseData = await response.json();
console.log(responseData);
推荐阅读
- mapbox - 如何将带有旋转的图标图像添加到静态 MapBox 图像?
- javascript - jquery on(click) 每次点击,信息取自第一个元素
- html - 我的 h1 元素的文本比元素的实际高度短。我可以删除空白空间吗?
- node.js - 改进 mongoose find() 查询执行时间
- python - 字符串列上的雾索引
- python - libvlc - http 流错误:本地流 1 错误:取消 (0x8)
- node.js - NodeJS 上的 FortiClient
- flutter - 在颤振运行期间收到多条错误消息(与 gradle 相关)
- java - 在编写junit测试用例时在Spring Webflux中自动装配ApplicationContext
- java - XMLBeans 无法加载 SchemaTypeSystem。无法加载名为 schemaorg_apache_xmlbeans.system 的类