在现代 web 应用开发中,数据的获取与处理是至关重要的环节。随着 API 的广泛应用,如何高效、便捷地进行网络请求,成为了开发者面临的一大挑战。Axios 作为一个基于 Promise 的 HTTP 客户端,因其简洁的 API 和强大的功能而受到广泛欢迎。它不仅支持浏览器和 Node.js 环境,还提供了丰富的功能,帮助开发者轻松处理各种网络请求。
本篇文章将深入探讨 Axios 的实用功能,帮助你全面了解这一强大工具的各种使用场景。我们将从 Axios 的基本用法入手,逐步介绍其在请求和响应拦截、请求取消、并发请求、响应数据转换等方面的高级功能。通过具体的代码示例和详细的解释,你将能够迅速掌握 Axios 的核心特性,并将其灵活应用于你的项目中。
在此过程中,我们还会讨论一些最佳实践,以帮助你优化网络请求的效率和用户体验,包括如何处理错误、设置请求的默认配置和管理请求的生命周期等。无论你是刚刚接触 Axios 的开发者,还是希望深入挖掘其潜力的经验人士,这篇文章都将为你提供实用的指导和灵感。
Axios 提供了许多快捷的请求方法,使得发起 HTTP 请求变得更加简单。在第 11.1 节中,我们编写的请求示例代码中使用的就是这些快捷方法。下面是一些常见的快捷请求方法:
GET 请求
axios.get(url[, config])
url
:请求的接口地址。config
:可选参数,用于配置请求的额外选项。POST 请求
axios.post(url[, data[, config]])
DELETE 请求
axios.delete(url[, config])
HEAD 请求
axios.head(url[, config])
OPTIONS 请求
axios.options(url[, config])
PUT 请求
axios.put(url[, data[, config]])
PATCH 请求
axios.patch(url[, data[, config]])
除了使用这些快捷方法之外,我们也可以通过自定义配置进行数据请求,示例代码如下:
let city = "上海";
city = encodeURI(city);
let api = `/simpleWeather/query?city=${city}&key=cffe158caf3fe63aa2959767a503xxxx`;
axios({
method: 'get',
url: "/myApi" + api,
}).then((response) => {
console.log(response.data);
});
使用上述配置进行的数据请求效果与使用快捷方法一致。需要注意的是,在配置时必须设置请求的 method
方法。
在同一个项目中,通常会使用到许多相似的请求配置。为了简化这一过程,可以创建一个新的 Axios 请求实例,示例代码如下:
// 创建 Axios 实例,统一配置 URL 前缀、超时时间和自定义的 header
const instance = axios.create({
baseURL: '/myApi',
timeout: 1000,
headers: {'X-Custom-Header': 'custom'}
});
let city = "上海";
city = encodeURI(city);
let api = `/simpleWeather/query?city=${city}&key=cffe158caf3fe63aa2959767a503xxxx`;
instance.get(api).then((response) => {
console.log(response.data);
});
如果需要让某些配置作用于所有请求,可以使用 Axios 的 defaults
属性进行配置:
axios.defaults.baseURL = '/myApi';
let city = "上海";
city = encodeURI(city);
let api = `/simpleWeather/query?city=${city}&key=cffe158caf3fe63aa2959767a503xxxx`;
axios.get(api).then((response) => {
console.log(response.data);
});
在对请求配置进行合并时,会按照以下优先级进行选择:
defaults
属性配置config
参数配置在 Axios 中,无论是使用配置的方式进行数据请求,还是使用快捷方法,都可以传递一个配置对象来对请求进行详细配置。该配置对象的参数非常丰富,如下表所示:
表 11-1 配置对象可配置的参数
参数 | 类型 | 说明 | 默认值 |
---|---|---|---|
url | 字符串 | 设置请求的接口 URL | 无 |
method | 字符串 | 设置请求方法 | ‘get’ |
baseURL | 字符串 | 设置请求的接口前缀,会拼接在 URL 前面 | 无 |
transformRequest | 函数 | 拦截请求并修改数据,此函数会传入 data 参数,返回修改后的数据 | 无 |
transformResponse | 函数 | 拦截请求回执并修改数据,此函数会传入 data 参数,返回修改后的数据 | 无 |
headers | 对象 | 自定义请求头 | 无 |
paramsSerializer | 函数 | 自定义参数的序列化方法 | 无 |
data | 字符、对象、数组等 | 设置请求体要发送的数据 | 无 |
timeout | 数值 | 设置请求的超时时间(单位为毫秒),若设置为 0,则永不超时 | 无 |
withCredentials | 布尔值 | 设置跨域请求时是否需要凭证 | false |
auth | 对象 | 设置用户信息(如用户名和密码) | 无 |
responseType | 字符串 | 设置响应数据的数据类型(如 ‘json’) | ‘json’ |
responseEncoding | 字符串 | 设置响应数据的编码方式 | ‘utf8’ |
maxContentLength | 数值 | 设置允许响应的最大字节数 | 无 |
maxBodyLength | 数值 | 设置请求内容的最大字节数 | 无 |
validateStatus | 函数 | 自定义请求结束的状态,返回布尔值决定请求是否成功 | (status) => status >= 200 && status < 300 |
当一个请求被发出后,Axios 会返回一个 Promise 对象。通过此 Promise 对象,可以异步地等待数据返回。Axios 返回的数据是一个包装好的对象,包含以下属性:
表 11-2 包装的属性
属性 | 类型 | 说明 |
---|---|---|
data | 对象 | 接口服务返回的响应数据对象 |
status | 数值 | 接口服务返回的 HTTP 状态码 |
statusText | 字符串 | 接口服务返回的 HTTP 状态信息 |
headers | 对象 | 响应头数据 |
config | 对象 | Axios 设置的请求配置信息 |
读者可以尝试在浏览器中打印这些数据,观察其中的信息,以便更好地理解 Axios 的工作机制。
请求拦截器允许开发者在请求发起之前,对请求进行修改或者添加一些定制化的逻辑。比如,可以在请求开始时展示页面的 Loading
效果,或者记录请求的日志信息。
示例代码:请求拦截器
axios.interceptors.request.use(
(config) => {
// 请求开始时触发
alert("请求将要开始");
return config; // 必须返回 config,否则请求无法继续
},
(error) => {
// 请求出错时触发
alert("请求出现错误");
return Promise.reject(error); // 返回错误,继续抛出
}
);
axios.get(api).then((response) => {
console.log(response.data);
});
在上面的代码中,axios.interceptors.request.use()
方法用于添加请求拦截器。拦截器的第一个函数会在请求发送前执行,第二个函数会在请求错误时执行。
请求拦截器的常见应用
Loading
效果。Authorization
)。响应拦截器则是在请求完成后,接收到响应之前进行拦截。开发者可以在这个阶段对响应数据进行处理,比如修改响应数据格式、处理错误等。
示例代码:响应拦截器
axios.interceptors.response.use(
(response) => {
// 请求成功,响应处理
alert(`响应状态: ${response.status}`);
return response; // 返回响应数据
},
(error) => {
// 请求失败,错误处理
alert("请求失败");
return Promise.reject(error); // 返回错误,继续抛出
}
);
在这个例子中,axios.interceptors.response.use()
方法用于添加响应拦截器。第一个函数会在接收到响应数据时执行,第二个函数会在响应失败时执行。
响应拦截器的常见应用
在某些情况下,我们可能不再需要某个拦截器,可以通过 eject
方法移除它。
示例代码:移除请求拦截器
let i = axios.interceptors.request.use(
(config) => {
alert("请求将要开始");
return config;
},
(error) => {
alert("请求出现错误");
return Promise.reject(error);
}
);
// 移除请求拦截器
axios.interceptors.request.eject(i);
这里的 eject()
方法可以用来移除某个拦截器,参数是拦截器的引用(即 i
)。这样,当你不再需要请求拦截器时,可以将其删除,避免影响后续请求。
通过使用 axios 的拦截器,我们可以在请求发起前或响应返回后,添加一些定制化的处理逻辑,例如:
Loading
效果、设置请求头信息等。同时,使用 eject()
方法可以在不需要时移除拦截器,灵活控制拦截行为。