axios POST请求击中控制器上的url,但将空值设置为我的POJO类,当我在chrome中通过开发人员工具时,有效载荷包含数据。我做错了什么?
Axios POST请求
var body = {
userName: 'Fred',
userEmail: 'Flintstone@gmail.com'
}
axios({
method: 'post',
url: '/addUser',
data: body
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
浏览器响应:
如果我设置头信息为:
headers:{
Content-Type:'multipart/form-data'
}
请求抛出错误
在发布多部分/表单数据时出错。内容类型报头缺少边界
如果我在邮递员中提出相同的请求,它就会正常工作,并为我的POJO类设置值。
有人能解释如何设置边界或如何使用axios发送表单数据吗?
在axios中使用application/x-www-form-urlencoded格式
默认情况下,axios将JavaScript对象序列化为JSON。发送数据
在application/x-www-form-urlencoded格式中,您可以使用
以下选项之一。
浏览器
在浏览器中,你可以像下面这样使用URLSearchParams API:
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);
请注意,URLSearchParams不是所有浏览器都支持的(参见caniuse.com),但有一个可用的polyfill(确保填充全局环境)。
或者,你可以使用qs库编码数据:
const qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));
或者用另一种方式(ES6),
import qs from 'qs';
const data = { 'bar': 123 };
const options = {
method: 'POST',
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: qs.stringify(data),
url, };
axios(options);
在发送请求时设置边界(服务器用来解析有效负载)。在发出请求之前无法获得边界。因此,更好的方法是从你的FormData中使用getBoundary()。
var formData = new FormData();
formData.append('userName', 'Fred');
formData.append('file0', fileZero);
formData.append('file1', fileOne);
axios({
method: "post",
url: "myurl",
data: formData,
headers: {
'Content-Type': `multipart/form-data; ${formData.getBoundary()}`,
})
.then(function (response) {
//handle success
console.log(response);
})
.catch(function (response) {
//handle error
console.log(response);
});
你可以通过使用FormData()来发布axios数据,比如:
var bodyFormData = new FormData();
然后将字段添加到您想要发送的表单:
bodyFormData.append('userName', 'Fred');
如果你正在上传图片,你可能想要使用.append
bodyFormData.append('image', imageFile);
然后你可以使用axios post方法(你可以相应地修改它)
axios({
method: "post",
url: "myurl",
data: bodyFormData,
headers: { "Content-Type": "multipart/form-data" },
})
.then(function (response) {
//handle success
console.log(response);
})
.catch(function (response) {
//handle error
console.log(response);
});
相关GitHub问题:
不能得到一个。post与'Content-Type': 'multipart/form-data'工作@ axios/axios
在axios中使用application/x-www-form-urlencoded格式
默认情况下,axios将JavaScript对象序列化为JSON。发送数据
在application/x-www-form-urlencoded格式中,您可以使用
以下选项之一。
浏览器
在浏览器中,你可以像下面这样使用URLSearchParams API:
const params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params);
请注意,URLSearchParams不是所有浏览器都支持的(参见caniuse.com),但有一个可用的polyfill(确保填充全局环境)。
或者,你可以使用qs库编码数据:
const qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));
或者用另一种方式(ES6),
import qs from 'qs';
const data = { 'bar': 123 };
const options = {
method: 'POST',
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: qs.stringify(data),
url, };
axios(options);
上传(多个)二进制文件
node . js
当您想通过多部分/form-data发布文件时,事情就变得复杂了,尤其是多个二进制文件。下面是一个工作示例:
const FormData = require('form-data')
const fs = require('fs')
const path = require('path')
const formData = new FormData()
formData.append('files[]', JSON.stringify({ to: [{ phoneNumber: process.env.RINGCENTRAL_RECEIVER }] }), 'test.json')
formData.append('files[]', fs.createReadStream(path.join(__dirname, 'test.png')), 'test.png')
await rc.post('/restapi/v1.0/account/~/extension/~/fax', formData, {
headers: formData.getHeaders()
})
而不是头:{'Content-Type': 'multipart/form-data'}我更喜欢头:formData.getHeaders()
我在上面使用了async和await,如果你不喜欢它们,你可以将它们更改为简单的Promise语句
为了添加你自己的头文件,你只需要头文件:{…formData.getHeaders()}
新增内容如下:
浏览器
浏览器的FormData不同于NPM包form-data。以下代码在浏览器中为我工作:
HTML:
<input type="file" id="image" accept="image/png"/>
JavaScript:
const formData = new FormData()
// add a non-binary file
formData.append('files[]', new Blob(['{"hello": "world"}'], { type: 'application/json' }), 'request.json')
// add a binary file
const element = document.getElementById('image')
const file = element.files[0]
formData.append('files[]', file, file.name)
await rc.post('/restapi/v1.0/account/~/extension/~/fax', formData)