Skip to content

axios 不同版本之间的问题

这里举例 0.19.2 这个版本(具体问题具体分析,这里只说这一类)

一般我们会初始化一个 axios 实例,对这个实例做一些事情并导出

例如配置一个 Content-Type 的值:

js
const service = axios.create({
    ...
});

service.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded";

...

export default service

实际使用时:

js
import request from './service.js'
request({
    url: '/save',
    method: 'post',
    data: {...}
})

结果会发现实际请求时,Content-Type 并不是如当初全局设置的那样

实际 Content-Typeapplication/json

而当更新 axios 版本后,才会达到预期的那样

这是因为某些版本(一般是旧版本),axios 会根据实际传参情况强制修改 Content-Type

部分源码如下(node_modules/axios/lib/defaults.js):

js
if (utils.isArrayBufferView(data)) {
    return data.buffer;
}
if (utils.isURLSearchParams(data)) {
    setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
    return data.toString();
}
if (utils.isObject(data)) {
    setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
    return JSON.stringify(data);
}

setContentTypeIfUnset 这个函数就是设置 Content-Type

可以看到会根据具体的传参设置不同的 Content-Type

因此之前在导出的实例上配置的没有效果

如果将 axios 更新为最新版本(应该是从某一个版本开始)则不会有这个问题

因为新版本的 axios 此部分源码已做修改,会将我们的配置直接返回

0