【Axios 教程】从入门到高级

发布于:2025-09-13 ⋅ 阅读:(10) ⋅ 点赞:(0)

嘿!在上次的 HTTP 请求格式文章中,我们聊到了前后端交互的核心——HTTP 请求。今天,我们来深入一个超级实用的工具:Axios。它是一个 JavaScript 库,用于在浏览器(前端)或 Node.js(后端)中发送 HTTP 请求。Axios 像一个智能的“快递员”,帮你处理请求和响应,比原生的 Fetch API 更易用、更强大。

为什么写这个教程?因为作为小白,你可能有很多疑问:Axios 是什么?怎么安装?怎么用?遇到错误怎么办?它和 Fetch 有什么区别?别担心,我会一步步详细解答所有常见疑问,确保全面覆盖从基础到高级的内容。教程基于实际代码示例,结合前后端交互场景。咱们用简单语言,像聊天一样讲解。

1. Axios 是什么?为什么用它?

基础介绍

Axios 是一个开源的、基于 Promise 的 HTTP 客户端库,由 Matt Zabriskie 创建,并于 ​​2014年​​ 在 GitHub 上首次发布。它支持浏览器和 Node.js 环境,主要用于发送 GET、POST 等 HTTP 请求,并处理响应。

  • 核心优势
    • 简单易用:语法直观,不用手动处理 JSON 转换。
    • 自动处理:自动转换请求/响应数据(如 JSON),支持拦截器(中间件)。
    • 浏览器兼容:内置对老浏览器的支持(如 IE)。
    • 功能丰富:错误处理、请求取消、并发等。

常见疑问解答1:Axios 和 Fetch 的区别?

  • Fetch 是浏览器内置的 API,更原生,但需要手动处理很多东西(如 JSON 解析、错误检查)。
  • Axios 是库,封装了 Fetch 的复杂性,提供更多功能(如默认头、拦截器)。如果你是小白,Axios 更友好,因为它“开箱即用”。例如,Fetch 不会自动抛出非 2xx 状态码的错误,但 Axios 会。
  • 什么时候用哪个?小项目用 Fetch 够了;复杂项目(如前后端交互频繁)用 Axios。

为什么用 Axios?

在前后端开发中,前端需要从后端 API 获取数据(如用户列表)。Axios 让这变得简单,避免了原生 XMLHttpRequest 的繁琐。

2. 安装和设置

步骤详解

  1. 浏览器环境(前端)

    • 用 CDN(内容分发网络)快速引入:在 HTML 中添加脚本标签。
      <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
      
    • 或用 npm(推荐 React/Vue 项目):在终端运行 npm install axios,然后在 JS 文件中导入:
      import axios from 'axios';
      
  2. Node.js 环境(后端)

    • 运行 npm install axios,然后 const axios = require('axios');

常见疑问解答2:安装失败怎么办?

  • 检查 npm 版本:运行 npm -v,确保 >= 6.x。
  • 网络问题:用 VPN 或换镜像(如 npm config set registry https://registry.npm.taobao.org)。
  • 权限问题:用 sudo npm install(Mac/Linux)或管理员模式(Windows)。
  • 如果是 Vue/React 项目,确保在 package.json 中看到 axios 依赖。

安装后,测试:运行 axios.get('https://api.example.com') 查看是否工作。

3. 基本用法:发送请求

Axios 的核心是 axios.request(config),但常用简写如 axios.get(url)

GET 请求(获取数据)

  • 语法axios.get(url, config)
  • 例子:从 API 获取用户列表。
    axios.get('https://api.example.com/users')
      .then(response => {
        console.log(response.data); // 响应数据
        console.log(response.status); // 200
      })
      .catch(error => {
        console.error(error);
      });
    
  • 解释.then 处理成功,.catch 处理失败。response 对象包括 data(实际数据)、status(状态码)、headers 等。

POST 请求(提交数据)

  • 语法axios.post(url, data, config)
  • 例子:登录表单。
    axios.post('https://api.example.com/login', {
      username: 'admin',
      password: 'secret'
    })
      .then(response => console.log('登录成功:', response.data))
      .catch(error => console.log('错误:', error.response.data));
    

其他方法

  • PUT(更新):axios.put(url, data)
  • DELETE(删除):axios.delete(url)
  • HEAD(只取头):axios.head(url)

配置选项(config)

自定义请求:如添加头、参数。

axios.get('/users', {
  params: { id: 123 }, // URL 参数: /users?id=123
  headers: { 'Authorization': 'Bearer token' } // 自定义头
});

常见疑问解答3:如何发送带参数的 GET?

params 对象,Axios 会自动拼到 URL 上。疑问:参数太多?用对象形式,避免手动拼接 URL(如 /users?id=1&name=John)。

4. 响应和错误处理

响应结构

Axios 返回一个 Promise,resolve 时是响应对象:

  • data:服务器返回的数据(自动 JSON 解析)。
  • status:HTTP 状态码(如 200 OK, 404 Not Found)。
  • headers:响应头。
  • config:原请求配置。
  • request:底层 XMLHttpRequest 对象。

错误处理

  • Axios 会抛出错误如果状态码不是 2xx。
  • 例子
    axios.get('/invalid-url')
      .catch(error => {
        if (error.response) {
          // 服务器响应了,但状态码错误
          console.log(error.response.status); // e.g., 404
        } else if (error.request) {
          // 请求发出但无响应(网络问题)
          console.log('无响应');
        } else {
          // 配置错误
          console.log(error.message);
        }
      });
    

常见疑问解答4:如何处理 401 Unauthorized(未授权)?

.catch 中检查 error.response.status === 401,然后重定向到登录页。另一个疑问:超时怎么办?设置 timeout: 5000(毫秒)在 config 中。

5. 高级功能

拦截器(Interceptors)

像“中间件”,在请求/响应前后插入逻辑。常用于添加 token 或日志。

  • 全局拦截

    axios.interceptors.request.use(config => {
      config.headers['Authorization'] = 'Bearer ' + localStorage.getItem('token');
      return config;
    }, error => Promise.reject(error));
    
    axios.interceptors.response.use(response => response, error => {
      if (error.response.status === 401) {
        // 处理未授权
      }
      return Promise.reject(error);
    });
    
  • 疑问解答5:拦截器和中间件的区别?拦截器是 Axios 专有的,类似 Express.js 的中间件,但只针对 HTTP。

并发请求

同时发多个请求:用 axios.allaxios.spread

axios.all([axios.get('/users'), axios.get('/posts')])
  .then(axios.spread((users, posts) => {
    console.log(users.data, posts.data);
  }));

请求取消

防止重复请求:用 CancelToken

const source = axios.CancelToken.source();
axios.get('/data', { cancelToken: source.token })
  .catch(err => {
    if (axios.isCancel(err)) console.log('请求取消');
  });
// 取消:source.cancel('用户取消');

自定义实例

创建多个 Axios 实例(如一个带基 URL)。

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 1000,
  headers: { 'X-Custom-Header': 'value' }
});
instance.get('/users');

常见疑问解答6:跨域(CORS)问题怎么办?

Axios 本身不处理 CORS(这是服务器端的事)。后端需设置 Access-Control-Allow-Origin 头。疑问:代理呢?在开发中,用 Vue CLI 的 proxy 或 webpack-dev-server 配置代理绕过。

其他高级疑问解答

  • 文件上传:用 FormData。
    const formData = new FormData();
    formData.append('file', fileInput.files[0]);
    axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } });
    
  • 认证:用 Basic Auth 或 JWT token 在 headers 中。
  • 与 Vue/React 集成:在组件的 mounted/lifecycle 中调用 Axios。
  • 性能优化:用 transformRequest/Response 自定义数据转换。
  • Node.js 专有:支持 HTTP/HTTPS 代理,设置 proxy 配置。

6. 常见问题与调试

  • 问题1:请求没发出去?检查 URL、网络、防火墙。
  • 问题2:JSON 解析错误?确保服务器返回正确 Content-Type。
  • 问题3:Promise 未处理?总是加 .catch
  • 调试技巧:用 axios.defaults.validateStatus = status => status < 500; 自定义错误范围。浏览器用 Network 面板查看请求。

7. 完整示例:前后端交互

假设前端用 Axios 从后端 API 获取数据:

// 前端
import axios from 'axios';

const api = axios.create({ baseURL: 'http://localhost:3000' });

api.get('/users')
  .then(res => console.log(res.data))
  .catch(err => console.error(err));

后端(Express.js):

app.get('/users', (req, res) => res.json([{ id: 1, name: 'John' }]));

结语

恭喜!你现在掌握了 Axios 从基础到高级的所有知识。作为小白,记住:多实践!从简单 GET 开始,逐步加功能。

资源推荐:Axios 官网(axios-http.com)、GitHub 示例、freeCodeCamp 教程。