全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

Vue大型项目API层封装与请求管理

大型Vue项目API层需统一管理HTTP请求,下面梳理核心封装策略。

axios实例配置

基础封装

JavaScript
// api/request.js
import axios from 'axios'

const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 15000,
  headers: { 'Content-Type': 'application/json' }
})

export default service

每个微服务或模块可创建独立axios实例,避免baseURL冲突。

拦截器设计

请求拦截器

JavaScript
service.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  (error) => Promise.reject(error)
)

响应拦截器

JavaScript
service.interceptors.response.use(
  (response) => {
    const { code, data, message } = response.data
    if (code === 200) return data
    ElMessage.error(message || '请求失败')
    return Promise.reject(new Error(message))
  },
  (error) => {
    const { response } = error
    const statusMap = {
      401: '未授权,请重新登录',
      403: '拒绝访问',
      404: '资源不存在',
      500: '服务器错误'
    }
    ElMessage.error(statusMap[response?.status] || '网络异常')
    if (response?.status === 401) {
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

接口模块化管理

按业务模块拆分

JavaScript
// api/user.js
import request from './request'

export const userApi = {
  getList: (params) => request.get('/users', { params }),
  getById: (id) => request.get(`/users/${id}`),
  create: (data) => request.post('/users', data),
  update: (id, data) => request.put(`/users/${id}`, data),
  remove: (id) => request.delete(`/users/${id}`)
}

// api/order.js
import request from './request'

export const orderApi = {
  getList: (params) => request.get('/orders', { params }),
  create: (data) => request.post('/orders', data)
}

统一导出

JavaScript
// api/index.js
export { userApi } from './user'
export { orderApi } from './order'

请求类型定义

TypeScript类型支持

TypeScript
// api/types.ts
export interface ApiResponse<T = any> {
  code: number
  data: T
  message: string
}

export interface PageResult<T> {
  list: T[]
  total: number
  page: number
  size: number
}

要点总结

  • 使用独立axios实例封装,避免全局配置污染
  • 请求拦截器统一处理Token注入
  • 响应拦截器统一处理错误码解析与提示
  • 接口按业务模块拆分,每个模块导出独立API对象
  • 大型项目应配合TypeScript提供类型约束

存放路径: articles/VUE/专家/大型项目架构分层设计/API层封装与请求管理.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 静态节点标记与优化
下一篇 → Vue大型项目国际化与主题方案
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库