Axios的QA

news/2025/2/26 7:25:51

Axios的Q&A

以下是 Axios 的必考经典面试题及对应答案,综合了高频考点和实际应用场景:


1. Axios 的核心特点是什么?

  • 基于 Promise 的 HTTP 库:支持所有 Promise API,简化异步请求处理。
  • 拦截请求和响应:可通过拦截器全局处理请求前的配置(如添加 Token)和响应后的逻辑(如错误处理)。
  • 自动转换数据:自动将响应数据转为 JSON 格式,支持请求数据的转换(如 transformRequest)。
  • 跨环境兼容:在浏览器中使用 XMLHttpRequest,在 Node.js 中使用 http 模块,基于适配器模式实现环境判断。
  • 防御 XSRF:通过配置 xsrfCookieNamexsrfHeaderName 防御跨站请求伪造攻击。
  • 取消请求:支持通过 AbortControllerCancelToken(旧版)取消请求。

2. Axios 的常用请求方法有哪些?

  • GETaxios.get(url, config),用于获取数据。
  • POSTaxios.post(url, data, config),用于提交数据。
  • PUTaxios.put(url, data, config),用于更新资源。
  • DELETEaxios.delete(url, config),用于删除资源。
  • 并发请求:通过 axios.all([requests]) 结合 axios.spread() 处理多个并发请求,底层基于 Promise.all 实现。

3. Axios 的核心配置属性有哪些?

  • 基础配置
    • url:请求地址。
    • method:请求方法(默认 GET)。
    • baseURL:基准 URL,自动拼接在相对路径前。
  • 数据处理
    • params:URL 参数(适用于 GET)。
    • data:请求体数据(适用于 POST/PUT)。
    • transformRequest:修改请求数据(仅限 POST/PUT/PATCH)。
    • transformResponse:修改响应数据。
  • 安全与网络
    • headers:自定义请求头。
    • auth:HTTP 基础认证(设置 Authorization 头)。
    • proxy:配置代理服务器。
    • timeout:请求超时时间(单位:毫秒)。

4. 如何实现请求拦截与响应拦截?

  • 请求拦截器:用于在请求发送前统一处理配置(如添加 Token)。
    axios.interceptors.request.use(
      config => {
        config.headers.Authorization = 'Bearer token';
        return config;
      },
      error => Promise.reject(error)
    );
    
  • 响应拦截器:用于处理响应数据或统一错误处理。
    axios.interceptors.response.use(
      response => response.data, // 直接返回响应数据
      error => {
        if (error.response.status === 401) {
          // 跳转登录页
        }
        return Promise.reject(error);
      }
    );
    

5. 如何取消 Axios 请求?

  • 使用 AbortController(推荐)
    const controller = new AbortController();
    axios.get('/api/data', { signal: controller.signal });
    controller.abort(); // 取消请求
    
  • 旧版 CancelToken(已弃用):
    const source = axios.CancelToken.source();
    axios.get('/api/data', { cancelToken: source.token });
    source.cancel('请求取消');
    

6. Axios 如何适配浏览器和 Node.js 环境?

  • 适配器模式:通过判断全局变量 XMLHttpRequest(浏览器)或 process(Node.js)自动切换请求适配器。
  • 源码实现
    function getDefaultAdapter() {
      if (typeof XMLHttpRequest !== 'undefined') return require('./adapters/xhr');
      if (typeof process !== 'undefined') return require('./adapters/http');
    }
    

7. 如何处理 Axios 请求失败重试?

通过响应拦截器实现:

const instance = axios.create({ retry: 3, retryDelay: 1000 });
instance.interceptors.response.use(null, (error) => {
  const config = error.config;
  if (!config.retry) return Promise.reject(error);
  config.__retryCount = config.__retryCount || 0;
  if (config.__retryCount >= config.retry) return Promise.reject(error);
  
  config.__retryCount++;
  return new Promise(resolve => 
    setTimeout(() => resolve(instance(config)), config.retryDelay)
  );
});

8. Axios 二次封装的常见配置

  • 基础配置:设置 baseURLtimeoutheaders
  • 拦截器增强:统一处理 Token、错误码、请求重试。
  • 多环境支持
    • 多个 baseURL:通过创建不同实例或动态修改请求拦截器中的 config.baseURL
    • 示例
      const api1 = axios.create({ baseURL: 'https://api1.com' });
      const api2 = axios.create({ baseURL: 'https://api2.com' });
      

9. Axios 与原生 Ajax 的区别

特性Axios原生 Ajax
封装方式基于 Promise,链式调用基于回调函数,代码冗余
跨域支持自动处理 CORS,支持 XSRF 防御需手动设置 withCredentials
数据转换自动转换 JSON 数据需手动解析 responseText
拦截器支持全局请求/响应拦截
环境兼容支持浏览器和 Node.js仅浏览器环境

10. Axios 的请求流程原理

  1. 调用 axios(config)axios.get() 等方法。
  2. 实际执行 Axios.prototype.request 方法。
  3. 合并默认配置与用户配置。
  4. 拦截器链:依次执行请求拦截器 → 发送请求(适配器) → 响应拦截器。
  5. 返回 Promise 对象,处理最终结果或错误。

以上信息覆盖了 Axios 的核心概念、配置、原理及实际应用场景。如需进一步了解细节,请自行参考相关技术文档或源码分析。


http://www.niftyadmin.cn/n/5868296.html

相关文章

【MySQL】服务正在启动或停止中,请稍候片刻后再试一次【解决方案】

问题呈现 在使用MySQL的过程中我们可能会遇到以上的情况 解决方法 首先以管理员身份打开命令行窗口,注意是管理员身份,不然无权限访问。输入命令tasklist| findstr "mysql",用于查找mysql的残留进程。这个时候我们就会看到一个…

【DeepSeek开源:会带来多大的影响】

DeepSeek 开源,震撼登场对云计算行业的冲击 巨头云厂商的新机遇 DeepSeek 开源后,为云计算行业带来了巨大的变革,尤其是为巨头云厂商创造了新的发展机遇。以阿里云为例,它作为云计算行业的领军者,与 DeepSeek 的合作…

【Linux】管道通信——命名管道

文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道,也称为 FIFO(First In First Out&#…

9. centos 离线安装docker

因为工作需要,我需要离线安装一些东西,比如postgre、redis、nginx等,这些可以通过源码手工编译(在离线情况下可能不太方便)。更方便的是使用docker 镜像。想使用docker镜像的话,首先要安装docker环境,以下是安装docker…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息:微软宣布推出一款免费的Office版本,允许用户进行基础文档编辑操作,但限制颇多,其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论,业界人士对其背后的商业策略和用户体验…

Jenkins重启后Maven的Project加载失败

个人博客地址:Jenkins重启后Maven的Project加载失败 | 一张假钞的真实世界 Jenkins重启后发现Maven的项目都没有正常加载。检查Jenkins的启动日志发现以下错误信息: java.io.IOException: Unable to read /home/jenkins/.jenkins/jobs/test-maven/conf…

3.1部署filebeat:5044

beats是ELK体系中新增的一个工具,, 属于一个轻量的日志采集器。 1.安装(每台) # tar xf filebeat-6.4.1-linux-x86_64.tar.gz # mv filebeat-6.4.1-linux-x86_64 /usr/local/filebeat #yum -y install httpd #systemctl start httpd 2.测试…

halcon三维点云数据处理(二十六)reduce_object_model_3d_to_visible_parts

目录 一、reduce_object_model_3d_to_visible_parts代码第一部分二、reduce_object_model_3d_to_visible_parts代码第二部分三、reduce_object_model_3d_to_visible_parts代码第三部分四、reduce_object_model_3d_to_visible_parts代码第四部分五、效果图一、reduce_object_mod…