AxiosFetch 都是在 JavaScript 应用中用来发起 HTTP 请求的流行工具,但它们在功能、语法和可用性方面存在一些差异。

Axios VS Fetch

特点/功能AxiosFetch
基于PromisePromise
JSON 处理自动处理 JSON 数据需要手动处理 JSON 数据
运行环境浏览器和 Node.js浏览器 (原生支持)
请求/响应拦截支持不支持
超时设置支持不支持(需要额外处理)
错误处理更详细的错误信息较基本的错误处理
请求取消支持支持(使用 AbortController)
设置 HTTP 头简单易用需要更多配置
发送/接收 Cookies默认不发送/接收,可配置默认不发送/接收,可配置
安全性(CSRF/XSRF 防护)内置支持需要手动处理
使用方式需要安装库浏览器原生支持,无需安装额外库
数据传输进度支持不支持

请求/响应拦截器

在 HTTP 请求的上下文中,请求/响应拦截器是非常强大的功能,它们允许开发者在请求发送到服务器和服务器响应返回到客户端之前,拦截并操作这些请求和响应。Axios 和 Fetch 在这方面的支持程度不同。

Axios 的请求/响应拦截器

Axios 支持请求和响应拦截器,这使得它在处理复杂的 HTTP 通信方面非常灵活和强大。

  • 请求拦截器:在请求被发送到服务器之前,允许你修改请求配置,如设置通用的头部、添加认证信息、日志记录或者在发送请求前执行某些动作。

    示例:

1axios.interceptors.request.use(config => {
2    // 修改 config
3    config.headers['Authorization'] = 'Bearer token';
4    return config;
5  }, error => {
6    // 请求错误的处理
7    return Promise.reject(error);
8  });
  • 响应拦截器:在服务器响应到达客户端之前,允许你处理响应数据,如统一处理错误、格式化响应数据等。

    示例:

1axios.interceptors.response.use(response => {
2    // 处理响应数据
3    return response;
4  }, error => {
5    // 响应错误的处理
6    return Promise.reject(error);
7  });

Fetch 的请求/响应拦截器

Fetch API 并不原生支持请求和响应的拦截器。这意味着如果你需要类似的功能,你可能需要手动实现它,或者使用额外的库来提供这种功能。

  • 对于请求,你可以在调用 fetch 之前手动修改请求参数。
  • 对于响应,你可以在处理 fetch 返回的 promise 时添加逻辑来实现类似的效果。

示例(模拟响应拦截器):

1fetch(url)
2  .then(response => {
3    // 检查并处理特定的响应状态
4    if (!response.ok) {
5      throw new Error('Response error');
6    }
7    return response.json();
8  })
9  .then(data => {
10    // 处理数据
11  })
12  .catch(error => {
13    // 错误处理
14  });

响应拦截器 - 总结

Axios 的请求和响应拦截器提供了更多的灵活性和控制力,特别是在构建需要复杂 HTTP 请求处理的应用时。而 Fetch 由于缺乏这种内置支持,使用起来在某些复杂场景下可能不够方便。在选择适合的工具时,这可能是一个重要的考虑因素。

总结 - 选择使用哪个

  • 如果你需要更多的内置功能,比如取消请求、拦截器或自动转换 JSON,Axios 是一个好选择。
  • 如果你倾向于使用原生 API 并且不介意编写额外的配置或封装,或者你的项目是一个轻量级的或不需要额外依赖的项目,Fetch 是一个不错的选择。