前端调通后端接口,axios的封装与错误处理实战

举报
yd_233495430 发表于 2026/09/02 15:08:41 2026/09/02
【摘要】 前后端分离项目里,前端调接口是最基础也最容易踩坑的环节。聊聊 axios 二次封装、拦截器统一收口错误,以及 token 过期、跨域、超时这些高频问题的应对。

一、为什么不直接裸调 fetch

原生 fetch 能用,但缺点明显:没有超时控制、响应要手动 res.json()、错误得自己判断状态码。项目里每个页面都这么写,重复代码多得没法看。所以一般都会包一层请求库,前端圈子里 axios 还是最主流的选择。

二、先做一个全局实例

baseURL、超时时间、公共请求头都集中到一个实例上,后面所有请求都走它:

import axios from 'axios';

const api = axios.create({
  baseURL: import.meta.env.VITE_API_BASE, // 不同环境切换地址
  timeout: 10000,                         // 10 秒还没响应就放弃
  headers: { 'Content-Type': 'application/json' },
});

export default api;

这样换环境只改一个变量,不用去几十个文件里翻。

三、用拦截器把错误收口

真正省心的是拦截器。请求拦截器统一加 token,响应拦截器统一处理"成功取 data、失败弹提示",业务代码里就干干净净了:

// 请求拦截:自动带登录态
api.interceptors.request.use((config) => {
  const token = localStorage.getItem('token');
  if (token) config.headers.Authorization = `Bearer ${token}`;
  return config;
});

// 响应拦截:错误在这里集中处理
api.interceptors.response.use(
  (res) => res.data,
  (err) => {
    if (err.response?.status === 401) {
      // token 过期,跳登录或静默刷新
      window.location.href = '/login';
    } else {
      alert(err.response?.data?.message || '网络异常,请稍后重试');
    }
    return Promise.reject(err);
  }
);

业务里直接 const list = await api.get('/orders'),不用每个地方都写 try/catch。

四、几个高频坑的对策

现象 常见原因 应对方式
401 反复弹登录 token 过期没处理 拦截器里刷新或跳登录
控制台报跨域 后端没开 CORS 让后端加白名单,dev 用代理
一直转圈不返回 没设超时 实例上配 timeout
生产地址写死 忘了用环境变量 baseURL 走 env

小结

调接口这事儿,核心就一句:把公共逻辑抽到拦截器和实例里,业务代码只关心拿数据。重复少了,坑也就集中到一个地方管了。剩下的就是和后端的联调耐心——接口文档写清楚、字段对得上,比什么封装都重要。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。