前端接口联调必修:Axios 指南

357 阅读7分钟

前置知识:HTTP 请求与 Axios 基础

1. HTTP 请求的基本概念

HTTP(超文本传输协议)是前端与后端通信的基础。当我们在浏览器中访问网页或发送数据时,实际上是在与服务器进行 HTTP 通信。一个完整的 HTTP 请求包含以下部分:

  • 请求方法:GET(获取数据)、POST(提交数据)、PUT(更新数据)、DELETE(删除数据)等
  • URL:请求的资源路径
  • 请求头:包含请求的附加信息,如 Content-Type、Authorization 等
  • 请求体:需要发送给服务器的数据(通常在 POST、PUT 请求中)
  • 响应:服务器返回的数据,包含状态码、响应头和响应体

2. 为什么需要 HTTP 客户端工具

浏览器原生提供了 XMLHttpRequest 对象用于发送 HTTP 请求,但它存在以下问题:

  • API 复杂,使用不够直观
  • 处理异步操作不方便,容易陷入回调地狱
  • 不支持 Promise
  • 配置和错误处理繁琐

为了解决这些问题,各种 HTTP 客户端工具应运而生,Axios 就是其中的佼佼者。

3. Axios 简介

什么是 Axios?

Axios 是一个基于 Promise 的 HTTP 客户端库,用于在浏览器和 Node.js 中发送请求,让前端与后端 API 交互更简单。

核心优势

  • Promise 支持:轻松处理异步操作
  • 简洁 API:学习成本低,上手快
  • 自动转换:自动处理 JSON 数据
  • 拦截器:轻松处理请求/响应
  • 跨平台:浏览器和 Node.js 都能用

安装

npm install axios

发送 GET 请求

import axios from 'axios';

axios.get('https://api.example.com/data')
  .then(res => console.log('数据:', res.data))
  .catch(err => console.error('错误:', err));

发送 POST 请求

axios.post('https://api.example.com/submit', {
  name: '张三',
  age: 25
})
  .then(res => console.log('提交成功:', res.data))
  .catch(err => console.error('提交失败:', err));

一、项目中的 Axios 配置

import axios from 'axios';
axios.defaults.baseURL = 'http://localhost:5173/api';
export default axios;

这三行代码做了三件事:

  1. 引入 axios 库,用于发 HTTP 请求。
  2. 给 axios 设基础路径 http://localhost:5173/api ,后续请求会自动拼这前缀。
  3. 导出配置好的 axios ,供其他文件发请求用。

二、API 接口封装

我们可以按功能模块封装 API 接口:

import axios from './config'
// todos接口
export const getTodos = () => {
    return axios.get('http://localhost:5173/api/todos')
}

export const getRepos = () => {
    return axios.get('http://localhost:5173/api/repos')
}

这里我们定义了两个接口函数:

  • getTodos():获取待办事项列表,使用 GET 方法请求 /api/todos 接口
  • getRepos():获取仓库列表,使用 GET 方法请求 /api/repos 接口

每个函数都返回 Axios 请求的 Promise,方便在调用处使用 async/await 语法。

三、在组件中使用 Axios

接口封装好后,我们可以在 React 组件中轻松使用。

// 导入 CSS 样式文件
import './App.css'
// 导入 React 的状态管理和副作用钩子
import { useState, useEffect } from 'react'
// 导入自定义 API 服务,用于获取数据
import { getTodos, getRepos } from './api'

/**
 * 应用根组件
 * 功能:获取待办事项和 GitHub 仓库数据并展示
 */
function App() {
  // 定义待办事项状态,初始值为空数组
  const [todos, setTodos] = useState([]);
  // 定义仓库列表状态,初始值为空数组
  const [repos, setRepos] = useState([]);

  // 使用 useEffect 处理组件挂载后的副作用(数据获取)
  useEffect(() => {
    // 定义异步函数处理数据获取逻辑
    const fetchData = async () => {
      try {
        // 调用 API 获取待办事项数据
        const todoResult = await getTodos()
        // 更新待办事项状态(假设 API 返回格式为 { data: [...] })
        setTodos(todoResult.data);
        
        // 调用 API 获取仓库数据
        const repoResult = await getRepos()
        // 更新仓库状态(假设 API 返回格式为 { data: [...] })
        setRepos(repoResult.data);
      } catch (error) {
        // 错误处理(实际项目中应添加错误状态管理)
        console.error('数据获取失败:', error);
      }
    }
    
    // 执行数据获取函数
    fetchData()
  }, []) // 空依赖数组确保只在组件挂载时执行一次

  return (
    <>
      {/* 渲染待办事项列表 */}
      {todos.map(todo => ( // 遍历待办事项数组
        <div key={todo.id}> {/* 使用唯一 ID 作为 key 优化渲染性能 */}
          {todo.title} {/* 显示待办事项标题 */}
        </div>
      ))}
      
      {/* 渲染仓库列表 */}
      {repos.map(repo => ( // 遍历仓库数组
        <div key={repo.id}> {/* 使用唯一 ID 作为 key */}
          {repo.name} {/* 显示仓库名称(修正为 name,假设 API 返回字段) */}
          {repo.description} {/* 显示仓库描述 */}
        </div>
      ))}
    </>
  )
}

export default App

这段代码展示了在 React 组件中使用 Axios 的标准流程:

  1. 引入需要的接口函数
  2. 使用 useState 定义状态来存储获取的数据
  3. 使用 useEffect 钩子在组件挂载时发起请求
  4. 使用 async/await 简化 Promise 处理
  5. 将获取的数据更新到组件状态中
  6. 渲染数据到页面

四、Mock 数据在项目中的应用

1. 什么是 Mock 数据

Mock 数据是指在开发过程中,当后端 API 还未 ready 时,前端开发者自己模拟的测试数据。使用 Mock 数据可以让前端开发不受后端进度的影响,实现前后端并行开发。

2. 项目中的 Mock 配置

在这里使用了 vite-plugin-mock 插件来实现 Mock 功能。

import { viteMockServe } from 'vite-plugin-mock'
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [
    react(),
    viteMockServe({
      mockPath: 'mock', // mock数据存放的目录
      enable: true, // 启用mock
    }),
  ],
})

配置说明:

  • mockPath: 'mock':指定 mock 数据存放在项目根目录下的 mock 文件夹中
  • enable: true:启用 mock 功能

3. Mock 数据的定义

在这里我们定义了两个接口的 Mock 数据:

export default [
    {
        url: '/api/todos', // 接口路径
        method: 'get', // 请求方法
        response: () => {
            const todos = [
                {
                    id: 1,
                    title: 'todo1',
                    completed: false,
                },
                {
                    id: 2,
                    title: 'todo2',
                    completed: true,
                }
            ]
            return {
                code: 0, // 状态码
                message: 'success', // 提示信息
                data: todos, // 数据
            }
        }
    },
    {
        url: '/api/repos',
        method: 'get',
        response: () => {
            const repos = [
                {
                    id: 695370163,
                    title: 'ai_lesson',
                    description: "AI全栈工程师课程",
                },
                {
                    id: 152578450,
                    title: 'AlloyFinger',
                    description: "super tiny size multi-touch gestures library for the web. You can touch this",
                }
            ]
            return repos
        }
    },
]

每个 Mock 接口的定义包含以下部分:

  • url:接口路径,与真实 API 保持一致
  • method:请求方法,如 GET、POST 等
  • response:响应函数,返回模拟的数据

4. Mock 数据的使用场景

  • 后端 API 未就绪:前端开发不需要等待后端接口完成
  • 测试不同场景:可以模拟各种数据场景,包括成功、失败、异常等
  • 性能测试:可以模拟大量数据,测试前端渲染性能
  • 隔离开发:前后端开发可以独立进行,互不影响

5. 如何在项目中使用 Mock 数据

在我们的项目中,使用 Mock 数据非常简单:

  1. 按照上述方式配置 vite-plugin-mock 插件
  2. mock 目录下定义 Mock 数据
  3. 正常调用 API 接口,Axios 会自动请求到 Mock 数据

五、最佳实践总结

  1. 集中配置:将 Axios 配置集中在一个文件中管理,便于统一维护
  2. 模块化封装:按业务功能划分 API 模块,提高代码可维护性
  3. 使用 async/await:简化 Promise 处理,使代码更加清晰
  4. 合理使用 Mock 数据:在开发阶段使用 Mock 数据提高开发效率
  5. 统一响应格式:前后端约定统一的响应格式,便于处理
  6. 错误处理:在组件中适当处理请求错误,提高用户体验

结语

通过本文的梳理,我们简单了解了前端与后端通信的核心流程:从 HTTP 请求的基础概念出发,借助 Axios 工具实现了请求的集中配置与模块化封装,再到在 React 组件中规范地使用接口数据,最后通过 Mock 数据解决了前后端并行开发的协同问题。

这一流程的核心价值在于标准化与效率:集中配置 Axios 实现了请求规则的统一管理,模块化封装 API 提升了代码的可维护性,而 Mock 数据则打破了开发进度的依赖壁垒。