[前端] axios网络请求二次封装

一、场景描述

为什么要对axios网络请求进行二次封装?
解决代码的复用,提高可维护性。 —这个有两个方案:一个是二次封装一个是实例化。(设置一些公共的参数,然后进行请求)
为什么可以解决代码的复用:
这是最简单格式的代码,需要定义url和请求方式。

axios({
   
   
  method: "get",
  url: "http://codercba.com:9002/banner",
}).then(function (response) {
   
   
    console.log(response);
}).catch(function (error) {
   
   
    console.log(error);
});

封装之后的请求方式,减少了点代码

    hyRequest.get({
   
    url: "/banner" }).then((res) => {
   
   
      console.log(res);
      setImg(res.banners);
      console.log(img);
    });

Axios实例化的输出

const instance = axios.create({
   
   
  baseURL: "http://codercba.com:9002",
});

instance.get("banner").then((response) => {
   
   
  console.log("实例化请求输出");
  console.log(response);
})
<think>我们参考提供的引用内容,总结axios二次封装的核心步骤和示例。 根据引用[1]和引用[3],我们可以得知二次封装通常包括: 1. 创建axios实例,并设置基础配置(如baseURL, timeout)。 2. 添加请求拦截器:常用于在请求发送前统一处理,例如添加token。 3. 添加响应拦截器:常用于统一处理响应,例如判断状态码、处理错误等。 引用[3]提供了一个相对完整的示例代码,我们以此为基础进行说明。 步骤: 1. 安装axios:在项目中安装axios(通过npm或yarn)。 2. 创建封装文件(例如request.js),并编写代码。 示例代码(基于引用[3]的示例,稍作整理和注释): ```javascript // 引入axios import axios from "axios"; import { ElMessage } from "element-plus"; // 如果使用Element Plus的消息提示 // 创建axios实例 const request = axios.create({ baseURL: '/api', // 基础路径,通常会根据环境变量配置 timeout: 5000, // 请求超时时间 }); // 请求拦截器 request.interceptors.request.use( (config) => { // 在发送请求之前可以做些什么,例如添加token // 假设token存储在localStorage中 const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { // 对请求错误做些什么 return Promise.reject(error); } ); // 响应拦截器 request.interceptors.response.use( (response) => { // 对响应数据做点什么 // 例如根据后端返回的状态码进行统一处理 // 假设我们约定响应中包含code字段,200表示成功 const res = response.data; if (res.code === 200) { return res; // 直接返回数据部分,这样在调用请求时就能直接拿到数据 } else { // 非200状态码,可以统一处理错误提示 ElMessage({ type: 'error', message: res.message || '请求出错', showClose: true, }); return Promise.reject(new Error(res.message || 'Error')); } }, (error) => { // 对响应错误做点什么(状态码不在2xx范围内) if (error.response) { // 根据不同的状态码进行提示 switch (error.response.status) { case 404: ElMessage.error('请求路径找不到'); break; case 500: ElMessage.error('服务器内部错误'); break; // 可以添加更多的状态码处理 default: ElMessage.error(`请求出错:${error.response.status}`); } } else { // 没有response的情况(如网络错误) ElMessage.error('网络错误,请检查网络连接'); } return Promise.reject(error); } ); // 导出封装后的请求方法 export default request; ``` 然后,在需要发送请求的地方,导入这个封装好的request对象,并使用它发送请求。 例如,在某个.vue文件中: ```javascript import request from '@/utils/request'; // 假设文件路径为@/utils/request.js request({ url: '/user/info', method: 'get' }).then(res => { console.log(res); }).catch(err => { console.error(err); }); ``` 关于跨域配置(引用[2]提到),通常在开发环境中,我们会在vite.config.js(或webpack配置)中配置代理: ```javascript // vite.config.js export default { server: { proxy: { '/api': { // 匹配以/api开头的请求 target: 'http://your-api-server.com', // 目标服务器 changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') // 重写路径,去掉/api前缀 } } } } ``` 这样,在开发环境中,前端请求的`/api`会被代理到目标服务器,解决跨域问题。 注意事项: 1. 实际项目中,baseURL可能需要根据环境变量动态设置(如开发、测试、生产环境有不同的API地址)。 2. 错误处理逻辑可以根据项目需要进行调整,例如使用不同的UI库提示消息。 §§相关问题§§ 1. 如何在axios请求拦截器中动态添加token? 2. axios响应拦截器中如何处理不同的错误状态码? 3. 在Vue3+Vite项目中如何配置环境变量来设置不同的baseURL? 4. 如何解决前端开发中的跨域问题? </think>### Axios请求二次封装的方法与示例 参考提供的引用内容,以下是axios二次封装的核心方法和具体示例: --- #### **一、封装核心方法** 1. **创建axios实例** - 设置基础URL(常用于跨域配置)和超时时间 - 示例配置: ```javascript const request = axios.create({ baseURL: '/api', // 需与vite.config.js代理配置关联 timeout: 5000 }); ``` 2. **请求拦截器** - 统一添加认证信息(如token) - 示例: ```javascript request.interceptors.request.use(config => { config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`; return config; // 必须返回配置对象 }); ``` 3. **响应拦截器** - 统一处理状态码和错误 - 示例: ```javascript request.interceptors.response.use( response => { if (response.data.code === 200) { return response.data; // 简化响应结构 } else { return Promise.reject(response.data.msg); } }, error => { // 根据HTTP状态码处理 switch (error.response?.status) { case 404: ElMessage.error('请求路径不存在'); break; case 500: ElMessage.error('服务器错误'); break; default: ElMessage.error('未知错误'); } return Promise.reject(error); } ); ``` --- #### **二、完整封装示例** ```javascript // utils/request.js import axios from "axios"; import { ElMessage } from "element-plus"; const request = axios.create({ baseURL: import.meta.env.VITE_API_BASEURL, // 通过环境变量配置 timeout: 10000 }); // 请求拦截器 request.interceptors.request.use(config => { const token = localStorage.getItem("auth_token"); if (token) config.headers.Authorization = `Bearer ${token}`; return config; }); // 响应拦截器 request.interceptors.response.use( response => { const { code, data, message } = response.data; if (code === 200) return data; ElMessage.warning(message || "业务逻辑错误"); return Promise.reject(message); }, error => { const status = error.response?.status; const errorMap = { 400: "请求参数错误", 401: "身份验证失败", 403: "无访问权限", 404: "资源不存在", 500: "服务器异常" }; ElMessage.error(errorMap[status] || "网络连接异常"); return Promise.reject(error); } ); export default request; ``` --- #### **三、使用方式** 1. **发起请求** ```javascript // userApi.js import request from '@/utils/request'; export const getUser = () => request({ url: '/user' }); export const login = (data) => request({ url: '/login', method: 'post', data }); ``` 2. **组件调用** ```vue <script setup> import { getUser } from '@/api/userApi'; const fetchData = async () => { try { const userData = await getUser(); console.log(userData); } catch (err) { console.error("请求失败", err); } }; </script> ``` --- #### **四、关键配置说明** 1. **跨域解决方案** 在 `vite.config.js` 配置代理: ```javascript export default { server: { proxy: { '/api': { target: 'http://real-api-domain.com', changeOrigin: true, rewrite: path => path.replace(/^\/api/, '') } } } } ``` 2. **环境变量配置** 创建 `.env.development` 和 `.env.production` 文件: ```ini # .env.development VITE_API_BASEURL = '/api' # .env.production VITE_API_BASEURL = 'https://prod-api.com' ``` --- #### **参考文献** 1. Axios拦截器与Token管理 [^1] 2. Vue3+Vite环境变量配置指南 [^2] 3. 响应状态码统一处理方案 [^3] --- ### 相关问题 1. 如何在axios拦截器中实现Token的无感刷新? 2. 不同HTTP状态码(如401、403)应该怎样差异化处理? 3. 如何用TypeScript对axios二次封装进行类型增强? 4. 在微前端架构中如何共享封装后的axios实例?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值