Skip to content

升级指南 ​

本指南旨在帮助你将项目从旧版本升级到新版本。建议阅读每个主要版本的发布说明,其中可能包含关于破坏性变更的重要信息。

升级到 v1.19.0 ​

格式错误的 HTTP(S) URL 将被拒绝 ​

现在,如果 http: 或 https: 的 url 或 baseURL 在协议后缺少 //,请求会被拒绝。请将 https:example.com 或 https:/example.com 等值替换为 https://example.com 等格式正确的 URL。生成的 AxiosError 使用 ERR_INVALID_URL 代码,并在安全隐藏敏感信息后指出有问题的 URL。此项安全行为变更旨在防止格式错误 URL 的规范化过程绕过 baseURL 或 URL 允许列表。

同步请求拦截器错误 ​

同步请求拦截器抛出错误时,axios 会调用其配对的拒绝处理器,并停止运行其余请求拦截器。正常返回的拒绝处理器会将错误视为已处理,并使用最后一个有效配置发送请求;它的返回值不会成为请求配置。如果验证必须阻止请求发送,请省略拒绝处理器,或让它抛出错误或返回已拒绝的 Promise。最终错误会继续传递给响应拒绝拦截器。

从 v0.x 升级到 v1.x ​

import 语句变更 ​

在 v1.x 中,import 语句改为使用 default 导出,你需要将 import 语句更新为如下形式:

diff
- import { axios } from "axios";
+ import axios from "axios";

拦截器系统变更 ​

在 v1.x 中,你需要使用 InternalAxiosRequestConfig 类型来为 request 拦截器的 config 参数标注类型。这是因为该参数现在的类型是 InternalAxiosRequestConfig,而不再是公开的 AxiosRequestConfig。

diff
- axios.interceptors.request.use((config: AxiosRequestConfig) => {
+ axios.interceptors.request.use((config: InternalAxiosRequestConfig) => {
    return config;
  });

请求头结构变更 ​

在 v1.x 中,请求头的结构已去除 common 属性,你需要按如下方式更新相关代码:

diff
- if (request.headers?.common?.Authorization) {
-       request.headers.common.Authorization = ...
+ if (request.headers?.Authorization) {
+       request.headers.Authorization = ...

原本位于 common、get、post 等属性下的默认请求头,现在直接设置在 axios.defaults.headers 上:

diff
- axios.defaults.headers.common["Accept"] = "application/json";
+ axios.defaults.headers["Accept"] = "application/json";

Multipart 表单数据 ​

如果请求包含 FormData 数据,Content-Type: multipart/form-data 请求头现在会被自动设置,请移除手动设置以避免重复:

diff
- axios.post("/upload", formData, {
-   headers: { "Content-Type": "multipart/form-data" },
- });
+ axios.post("/upload", formData);

如果你明确设置了 Content-Type: application/json,axios 现在会自动将数据序列化为 JSON。

参数序列化 ​

v1.x 对 URL 参数的序列化方式进行了若干破坏性变更,主要包括:

params 默认会进行百分号编码。 如果你的后端期望接收 qs 风格的原始方括号编码,可能需要配置自定义序列化器:

js
import qs from 'qs';

axios.create({
  paramsSerializer: {
    serialize: (params) => qs.stringify(params, { arrayFormat: 'brackets' }),
  },
});

params 中的嵌套对象现在使用方括号表示法(foo[bar]=1)序列化,而不再使用点号表示法。如果你的后端期望点号表示法,请使用自定义序列化器。

null 和 undefined 参数的处理方式现在已统一:null 值序列化为空字符串,而 undefined 值则被完全忽略。

关于参数序列化配置的完整选项,请参阅请求配置页面。

内部模块不再导出 ​

我们决定不再导出 axios 的内部模块,你需要将代码更新为仅使用 axios 的公开 API。此变更旨在简化 API,缩小 axios 的接口范围,使我们能够在不声明破坏性变更的情况下修改内部实现。

请查阅本站的 API 参考,获取最新的公开 API 信息。

请求配置 ​

我们对请求配置对象进行了调整,请查阅本站的配置参考获取最新信息。

遗漏的破坏性变更 ​

本指南并不详尽,可能未涵盖所有破坏性变更。如果你遇到任何问题,欢迎在 docs GitHub 仓库提交 issue,并添加 breaking change 标签。

axios is provided under MIT license