我的代码:
fetch("api/xxx", {
body: new FormData(document.getElementById("form")),
headers: {
"Content-Type": "application/x-www-form-urlencoded",
// "Content-Type": "multipart/form-data",
},
method: "post",
}
我尝试使用fetch api发布我的表单,它发送的正文是这样的:
-----------------------------114782935826962
Content-Disposition: form-data; name="email"
test@example.com
-----------------------------114782935826962
Content-Disposition: form-data; name="password"
pw
-----------------------------114782935826962--
(我不知道为什么每次发送的时候boundary里的数字都会变…)
我想用“Content-Type”:“application/x-www-form-urlencoded”发送数据,我该怎么做?或者如果我必须处理它,我如何解码控制器中的数据?
请回答我的问题,我知道我能做到:
fetch("api/xxx", {
body: "email=test@example.com&password=pw",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
method: "post",
}
我想要的是像$(“#form”).serialize()在jQuery (w/o使用jQuery)或解码控制器中的多部分/表单数据的方法。谢谢你的回答。
"body:FormData"工作,但有类型投诉,也"FormData"设置多部分头。为了让事情更简单,"body:URLSearchParams"可以使用内联结构和手动设置的头部:
function getAccessToken(code) {
return fetch(tokenURL,
{
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': '*/*'
},
body: new URLSearchParams({
'client_id':clientId,
'client_secret':clientSecret,
'code':code,
'grant_type': grantType,
'redirect_uri':'',
'scope':scope
})
}
)
.then(
r => return r.json()
).then(
r => r.access_token
)
}
Content-Type: " multipart /form-data"
const formData = new FormData(document.getElementById("form"))
fetch("http://localhost:8000/auth/token", {
method: "POST",
body: formData,
headers: {
"Content-Type": "multipart/form-data"
}
})
Content-Type: "application/x-www-form-urlencoded"
const formData = new URLSearchParams(new FormData(document.getElementById("form")))
fetch("http://localhost:8000/auth/token", {
method: "POST",
body: formData,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
})
MDN上有一些说明,浏览器将自动处理Content-Type:
如果字典中没有设置内容类型头,请求也会自动设置一个内容类型头。
所以当我们发送一个取回请求时,我们不需要指定'content-type'。
const formData = new FormData();
const fileField = document.querySelector('input[type="file"]');
formData.append('username', 'abc123');
formData.append('avatar', fileField.files[0]);
fetch('https://example.com/profile/avatar', {
method: 'PUT',
body: formData
})
.then(response => response.json())
.then(result => {
console.log('Success:', result);
})
.catch(error => {
console.error('Error:', error);
});
如果在头文件中设置content-type。浏览器将不会尝试分割请求有效负载中的表单数据。
我使用fathcer来处理FormData,与XHR的行为相同。
import { formData } from '@fatcherjs/middleware-form-data';
import { json } from '@fatcherjs/middleware-json';
import { fatcher } from 'fatcher';
fatcher({
url: '/bar/foo',
middlewares: [json(), formData()],
method: 'PUT',
payload: {
bar: 'foo',
file: new File()
},
headers: {
'Content-Type': 'multipart/form-data',
},
})
.then(res => {
console.log(res);
})
.catch(err => {
console.error(error);
});