@
NathanDo 你这是故意把代码写复杂了,如果使用原生的 fetch ,相比 application/json ,application/x-www-form-urlencoded 会更简单:
```
fetch('/', {
method: 'POST',
headers:{
'content-type': 'application/json',
},
body: JSON.stringify({
a: 1,
b: 2,
}),
})
```
对比
```
fetch('/', {
method: 'POST',
body: new URLSearchParams({
a: 1,
b: 2,
}),
})
```
原因是浏览器默认网络请求都不认识 json 的,不指定 header 的话都默认 text/plain (如果 body 指定对象的话会自动 toString 变成 [object Object]),而 URLSearchParams 的构造函数就支持直接传对象,并且直接提交自动设置正确的请求头 application/x-www-form-urlencoded 。
@
yaphets666 至于 FormData ,通常只会在上传文件的时候才会用(由于设计原因,平常用有点浪费网络资源,弱网环境影响体验)。而上传文件的话,你就要有个文件来源,一般是写一个 form 里带一个 input type="file",而 FormData 天生就为这个场景设计,只要 getElementById 拿到 form 对象,直接传给构造函数 new FormData(form) 就可以了。
同样代码也很简单,也会自动设置正确的请求头 multipart/form-data; boundary=xxx:
```
fetch('/', {
method: 'POST',
body: new FormData(document.getElementById('form')),
})
```
[当然,如果使用的是第三方的网络请求库的话,那应该是 JSON/x-www-form-urlencoded/form-data 站在同等地位啊,具体走什么都取决于封装而已。]