Axios 相关的面试题

news2025/4/9 6:33:52

在跟着视频教程学习项目的时候使用了axios发送请求,但是只是跟着把代码粘贴上去,一些语法规则根本不太清楚,但是根据之前的博客学习了fetch了之后,一看axios的介绍就明白了。所以就直接展示axios的面试题吧


本文主要内容:

  • Axios 基本用法(GET/POST/PUT/DELETE、拦截器、超时、取消请求)

  • Axios vs Fetch 区别

  • 为什么要二次封装 Axios,如何封装

  • 在 Vue/React 项目中的实践

  • 文件上传、请求重试、高级优化

📌 1. Axios 基础问题

Q1:Axios 是什么?它的特点是什么?

💡 回答要点

Axios 是一个 基于 Promise 的 HTTP 客户端,用于发送 HTTP 请求,支持浏览器和 Node.js。

特点

  • 自动解析 JSONresponse.data 直接返回 JSON)
  • 拦截器(Interceptors)(可以在请求/响应前后进行处理)
  • 支持取消请求CancelToken
  • 支持超时设置timeout 参数)
  • 支持请求并发控制axios.all()
  • 自动携带 Cookies(支持 withCredentials

Q2:Axios 和 Fetch 有什么区别?

💡 回答要点
对比项AxiosFetch
自动解析 JSON✅ 是,response.data 直接是 JSON❌ 需要手动 response.json()
请求/响应拦截器✅ 支持❌ 需要手动封装
超时设置timeout 选项❌ 需要 AbortController 实现
取消请求CancelToken❌ 需要 AbortController
错误处理catch 直接捕获 HTTP 错误❌ 需检查 response.ok
默认携带 Cookies✅ 是❌ 需 credentials: 'include'

👉 Axios 更易用,适用于企业级项目,Fetch 适合轻量级需求。


📌 2. Axios 高级用法

Q3:如何在 Axios 里发送 GET/POST/PUT/DELETE 请求?

💡 回答要点
// GET 请求
axios.get('/api/users').then(response => console.log(response.data));

// POST 请求
axios.post('/api/users', { name: "Alice" }).then(response => console.log(response.data));

// PUT 请求
axios.put('/api/users/1', { name: "Updated Alice" }).then(response => console.log(response.data));

// DELETE 请求
axios.delete('/api/users/1').then(response => console.log("Deleted"));

Q4:如何在 Axios 里设置请求头?

💡 回答要点
axios.get('/api/data', {
    headers: { 'Authorization': 'Bearer token123' }
}).then(response => console.log(response.data));

Q5:如何使用 Axios 进行并发请求?

💡 回答要点

可以使用 axios.all() 进行多个请求并发处理:

axios.all([
    axios.get('/api/user'),
    axios.get('/api/orders')
]).then(axios.spread((userRes, ordersRes) => {
    console.log(userRes.data, ordersRes.data);
}));

Q6:如何取消 Axios 请求?

💡 回答要点

使用 CancelToken 取消请求:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/api/data', { cancelToken: source.token })
    .then(response => console.log(response.data))
    .catch(error => {
        if (axios.isCancel(error)) {
            console.log("Request canceled", error.message);
        }
    });

// 取消请求
source.cancel("Request aborted by user");

Q7:如何在 Axios 里设置超时?

💡 回答要点
axios.get('/api/data', { timeout: 5000 }) // 5 秒超时
    .then(response => console.log(response.data))
    .catch(error => console.error("Timeout or request error:", error));

📌 3. Axios 二次封装相关问题

Q8:为什么要对 Axios 进行二次封装?

💡 回答要点
  1. 减少代码重复(比如每次请求都要加 headers
  2. 统一错误处理(拦截所有错误,防止每次 catch
  3. 自动添加 Token(可以在拦截器里统一添加)
  4. 支持自定义请求实例(可创建不同 baseURL 的 Axios 实例)
  5. 提高可维护性(项目规模变大后更容易管理)

Q9:如何对 Axios 进行二次封装?

💡 回答要点

📌 1️⃣ 创建 axiosInstance

import axios from 'axios';

// 创建 Axios 实例
const axiosInstance = axios.create({
    baseURL: "https://api.example.com",
    timeout: 10000, // 超时 10s
    headers: { "Content-Type": "application/json" }
});

// 添加请求拦截器(请求前统一处理)
axiosInstance.interceptors.request.use(config => {
    const token = localStorage.getItem("token");
    if (token) {
        config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
}, error => Promise.reject(error));

// 添加响应拦截器(统一错误处理)
axiosInstance.interceptors.response.use(response => {
    return response.data;  // 直接返回 data,避免每次 `response.data`
}, error => {
    console.error("API Error:", error.response?.status, error.message);
    return Promise.reject(error);
});

export default axiosInstance;

📌 2️⃣ 使用封装的 axiosInstance

import axiosInstance from './axiosInstance';

axiosInstance.get("/users")
    .then(data => console.log(data))
    .catch(error => console.error("Request failed:", error));

Q10:如何在 Vue/React 项目中使用封装后的 Axios?

💡 回答要点

在 Vue/React 项目中,可以在 api 目录下创建一个 request.js 进行二次封装。

📌 Vue 里使用

import axiosInstance from './axiosInstance';

export function getUserList() {
    return axiosInstance.get('/users');
}

// 在 Vue 组件中使用
getUserList().then(users => console.log(users));

📌 React 里使用

import React, { useEffect, useState } from "react";
import axiosInstance from "./axiosInstance";

function UserList() {
    const [users, setUsers] = useState([]);

    useEffect(() => {
        axiosInstance.get("/users").then(setUsers);
    }, []);

    return <ul>{users.map(user => <li key={user.id}>{user.name}</li>)}</ul>;
}

export default UserList;

📌 4. 高级问题

Q11:如何使用 Axios 处理文件上传?

💡 回答要点
const formData = new FormData();
formData.append("file", file);

axios.post('/upload', formData, {
    headers: { "Content-Type": "multipart/form-data" }
}).then(response => console.log(response.data));

Q12:如何实现 Axios 的请求重试?

💡 回答要点

使用拦截器在请求失败时自动重试:

axiosInstance.interceptors.response.use(null, async error => {
    if (error.config && !error.config.__isRetryRequest) {
        error.config.__isRetryRequest = true;
        return axiosInstance(error.config); // 重新发送请求
    }
    return Promise.reject(error);
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6对函数参数的新设计

ES6 对函数参数进行了新的设计&#xff0c;主要添加了默认参数、不定参数和扩展参数&#xff1a; 不定参数和扩展参数可以认为恰好是相反的两个模式&#xff0c;不定参数是使用数组来表示多个参数&#xff0c;扩展参数则是将多个参数映射到一个数组。 需要注意&#xff1a;不定…

LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版

LLaMA Factory微调后的大模型Chat对话效果&#xff0c;与该模型使用vLLM推理架构中的对话效果&#xff0c;可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定&#xff1a;有一半是对的&#xff0c;有一半是无关的。 1、未…

群体智能优化算法-鹈鹕优化算法(Pelican Optimization Algorithm, POA,含Matlab源代码)

摘要 鹈鹕优化算法&#xff08;Pelican Optimization Algorithm, POA&#xff09;是一种灵感来自自然界鹈鹕觅食行为的元启发式优化算法。POA 模拟鹈鹕捕食的两个主要阶段&#xff1a;探索阶段和开发阶段。通过模拟鹈鹕追捕猎物的动态行为&#xff0c;该算法在全局探索和局部开…

在 Blazor 中使用 Chart.js 快速创建数据可视化图表

前言 BlazorChartjs 是一个在 Blazor 中使用 Chart.js 的库&#xff08;支持Blazor WebAssembly和Blazor Server两种模式&#xff09;&#xff0c;它提供了简单易用的组件来帮助开发者快速集成数据可视化图表到他们的 Blazor 应用程序中。本文我们将一起来学习一下在 Blazor 中…

SQL server 2022和SSMS的使用案例1

一&#xff0c;案例讲解 二&#xff0c;实战讲解 实战环境 你需要确保你已经安装完成SQL Server 2022 和SSMS 20.2 管理面板。点此跳转至安装教程 SQL Server2022Windows11 专业工作站SSMS20.2 1&#xff0c;连接数据库 打开SSMS&#xff0c;连接数据库。 正常连接示意图&…

GO语言学习(14)GO并发编程

目录 &#x1f308;前言 1.goroutine&#x1f31f; 2.GMP模型&#x1f31f; 2.1 GMP的由来☀️ 2.2 什么是GMP☀️ 3.channel &#x1f31f; 3.1 通道声明与数据传输&#x1f4a5; 3.2 通道关闭 &#x1f4a5; 3.3 通道遍历 &#x1f4a5; 3.4 Select语句 &#x1f4…

【Audio开发二】Android原生音量曲线调整说明

一&#xff0c;客制化需求 客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。 二&#xff0c;音量曲线调试流程 Android根据不同的音频流类型定义不同的曲线&#xff0c;曲线文件存放在/vendor/etc/audio_policy_volumes.xml或者default_volu…

spring-security原理与应用系列:HttpSecurity.filters

目录 AnyRequestMatcher WebSecurityConfig HttpSecurity AbstractInterceptUrlConfigurer AbstractAuthenticationProcessingFilter 类图 在前面的文章《spring-security原理与应用系列&#xff1a;securityFilterChainBuilders》中&#xff0c;我们遗留了一个问题&…

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前五篇文章中&#xff0c;我们深入探讨了JVM生产环境问题定位与解决的实战技巧&#xff0c;从基础的jps、jmap、jstat、jstack、jcmd等工具&#xff0c;到JConsole、VisualVM、MAT的…

并行治理机制对比:Polkadot、Ethereum 与 NEAR

治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展&#xff0c;决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…

TDengine tar.gz和docker两种方式安装和卸载

下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后&#xff0c;进入相应子目录&#xff0c;执行其中的 install.…

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统&#xff0c;整个系统由AS608指纹识别模块&#xff0c;矩阵键盘&#xff0c;STM32F103单片机&#xff0c;OLED液晶&#xff0c;RFID识别模块&#xff0c;继电器&#xff0c;蜂鸣器等构成&#xff0c;在使用时&#xff0c;用户可以录入新的指纹…

java知识梳理(二)

一.lambda表达式 作用&#xff1a;Lambda 表达式在 Java 8 引入&#xff0c;主要用于简化匿名内部类的写法&#xff0c;特别是在函数式编程场景中&#xff0c;比如 函数式接口、流式 API&#xff08;Streams&#xff09;、并发编程等。它让 Java 代码更简洁、可读性更强&#x…

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价

内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务&#xff0c;通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域&#xff0c;依托ISO 17100认证的翻译流程和Trados术语管理系统&#xff0c;实现技术文档的精准转化。为提升…

LeetCode 解题思路 30(Hot 100)

解题思路&#xff1a; 递归参数&#xff1a; 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程&#xff1a; 当当前路径 path 的长度等于 n * 2 时&#xff0c;说明已经生成有效括号&#xff0c;加入结果集。若左括号数小于 n&…

Java EE(18)——网络原理——应用层HTTP协议

一.初识HTTP协议 HTTP(HyperText Transfer Protocol&#xff0c;超文本传输协议)是用于在客户端&#xff08;如浏览器&#xff09;和服务器之间传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议。 HTTP协议发展至今发布了多个版本&#xff0c;其中1.0&#xff0c;1.…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…

Qt笔记----》不同环境程序打包

文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式&#xff1a;windows/linux 1、windows环境下打包qt程序 …