Reactjs 应用程序中的Axios。过帐带有表单数据的图像发送带有空正文的请求
我正在尝试将图像文件发送到我的后端API。最后一个可以和邮递员一起工作。问题不在于图像,我无法使用axios和表单数据发送任何请求,无论我是否附加图像 fetch一切正常。理解fetch不需要任何内容类型需要花费时间,最后自动生成具有右边界的Reactjs 应用程序中的Axios。过帐带有表单数据的图像发送带有空正文的请求,reactjs,header,axios,Reactjs,Header,Axios,我正在尝试将图像文件发送到我的后端API。最后一个可以和邮递员一起工作。问题不在于图像,我无法使用axios和表单数据发送任何请求,无论我是否附加图像 fetch一切正常。理解fetch不需要任何内容类型需要花费时间,最后自动生成具有右边界的多部分/表单数据 正如所写的那样,axios应该与fetch做相同的事情,但它不会生成或更改其内容类型。传递头'content-type':'multipart/form data当然不会起作用。当我不设置内容类型时,它只使用application/json
多部分/表单数据
正如所写的那样,axios应该与fetch做相同的事情,但它不会生成或更改其内容类型。传递头'content-type':'multipart/form data
当然不会起作用。当我不设置内容类型时,它只使用application/json
。我在文档中找不到类似的内容。无论它说什么,axios都应该自动创建内容类型标题
我的axios版本是0.18.0
。
下面是代码,再简单不过了=)
请您尝试一下这段代码好吗?您可以这样尝试:
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);
});
#######更新#######
原来问题出在axios拦截器上。如果你不使用拦截器,你就不会遇到这个问题。所以,当我创建新实例并删除所有头文件时,没有调用拦截器,这就是我的代码工作的原因。但让我带来更多细节,帮助其他人避免这种痛苦。拦截器具有transformRequest
功能,其中存在这部分代码
if (utils.isObject(data)) {
setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
return JSON.stringify(data);
}
其中setContentTypeIfUnset
函数是
function setContentTypeIfUnset(headers, value) {
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
headers['Content-Type'] = value;
}
}
因此,如果您的对象有未定义的头,您也将通过这种情况。但在我的情况下,即使删除了所有的头,我也必须向我的应用程序传递一些头。在设置它时,拦截器调用transfromRequest
函数,将该头添加到我的formdata
请求中。
我希望在未来的版本中axios能够解决这个问题
#######旧答案#######
正如我所猜测的,我的项目中的axios以某种方式为标题内容类型设置了默认值,甚至将其设置为“content-type”:未定义的并没有覆盖该值。
这是解决办法
let axiosInstance = axios.create();
delete axiosInstance.defaults.headers;
然后使用该实例
花了一整天的时间来寻找这个解决方案。谢谢您的尝试,但没有成功。相同的空正文。你可以发布你正在发送的实际url和有效负载,或者可能是正在工作的邮递员请求吗?我可以,但它只是一些带有表单数据的url,其中只包含一个图像。这没用。我还提到了fetch请求的相同逻辑。内容类型标题有一些问题。正如我现在看到的,axios以某种方式使用了它的默认内容类型,这就是代码无法工作的原因。我只需要弄清楚他是如何设置头球位置的。
function setContentTypeIfUnset(headers, value) {
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
headers['Content-Type'] = value;
}
}
let axiosInstance = axios.create();
delete axiosInstance.defaults.headers;