当前位置: 首页 > news >正文

vue封装请求拦截器 响应拦截器

在 Vue 项目中封装请求拦截器和响应拦截器通常使用 Axios 库。以下是一个完整的封装示例,包含基础配置、拦截器实现和错误处理:

### 第一步:安装 Axios
```bash
npm install axios
```

### 第二步:创建封装文件 `src/utils/request.js`
```javascript
import axios from 'axios'
import { Message } from 'element-ui' // 按需引入 UI 框架提示组件
import router from '@/router' // 引入路由实例

// 创建 axios 实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 从环境变量读取基础 URL
timeout: 10000, // 请求超时时间
headers: { 'Content-Type': 'application/json;charset=UTF-8' }
})

// 请求拦截器
service.interceptors.request.use(
config => {
// 在发送请求之前做些什么(例如添加 token)
const token = localStorage.getItem('token')
if (token) {
config.headers['Authorization'] = `Bearer ${token}`
}

// 可添加全局 loading 控制
// showLoading()

return config
},
error => {
// 对请求错误做些什么
return Promise.reject(error)
}
)

// 响应拦截器
service.interceptors.response.use(
response => {
// 隐藏全局 loading
// hideLoading()

// 处理二进制数据
if (response.config.responseType === 'blob') {
return response.data
}

const res = response.data

// 根据后端约定判断业务状态码
if (res.code !== 200) {
// 处理特殊状态码(如 token 过期)
if (res.code === 401) {
Message.error('登录已过期,请重新登录')
router.push('/login')
return Promise.reject(new Error('未授权'))
}

// 显示错误提示(可配置不显示特定状态码)
if (!response.config.noShowError) {
Message.error(res.message || '请求失败')
}

return Promise.reject(new Error(res.message || 'Error'))
} else {
// 返回核心数据
return res.data
}
},
error => {
// 隐藏全局 loading
// hideLoading()

// 处理 HTTP 状态码错误
if (error.response) {
switch (error.response.status) {
case 400:
error.message = '请求错误'
break
case 401:
error.message = '未授权,请登录'
router.replace('/login')
break
case 403:
error.message = '拒绝访问'
break
case 404:
error.message = `请求地址出错: ${error.response.config.url}`
break
case 500:
error.message = '服务器内部错误'
break
default:
error.message = `连接错误 ${error.response.status}`
}
} else if (error.message.includes('timeout')) {
error.message = '请求超时,请检查网络'
} else {
error.message = '网络连接异常'
}

Message.error(error.message)
return Promise.reject(error)
}
)

/**
* 封装通用请求方法
* @param {Object} config 请求配置
*/
export function request(config) {
return service(config)
}

/**
* 封装 GET 请求
* @param {String} url 
* @param {Object} params 
* @param {Object} options 额外配置 
*/
export function get(url, params = {}, options = {}) {
return service({
url,
method: 'get',
params,
...options
})
}

/**
* 封装 POST 请求
* @param {String} url 
* @param {Object} data 
* @param {Object} options 额外配置
*/
export function post(url, data = {}, options = {}) {
return service({
url,
method: 'post',
data,
...options
})
}

// 导出其他常用方法
export default {
request,
get,
post,
put: (url, data) => service({ url, method: 'put', data }),
delete: url => service({ url, method: 'delete' })
}
```

### 第三步:在 Vue 中全局引入(可选)
`src/main.js`
```javascript
import Vue from 'vue'
import request from '@/utils/request'

Vue.prototype.$http = request // 组件内使用 this.$http.get(...)
```

### 第四步:在组件中使用
```vue
<script>
import { get, post } from '@/utils/request'

export default {
methods: {
// GET 请求示例
async fetchData() {
try {
const res = await get('/api/user/list', {
page: 1,
size: 20
}, {
noShowError: true // 可选:禁止自动显示错误
})
console.log('数据获取成功', res)
} catch (err) {
console.error('请求失败', err)
}
},

    // POST 请求示例
async submitForm() {
const data = { username: 'admin', password: '123456' }
const res = await post('/api/login', data)
console.log('登录结果', res)
},

    // 使用全局注入方式
async deleteItem() {
const res = await this.$http.delete('/api/item/123')
console.log('删除结果', res)
}
}
}
</script>
```

### 关键功能说明:
1. **请求拦截器**:
- 自动添加 JWT 认证 Token
- 统一设置 Content-Type
- 全局 Loading 控制点(需自行实现)

2. **响应拦截器**:
- 处理二进制响应数据
- 统一处理业务错误码(如 401 跳转登录)
- 捕获 HTTP 状态码错误
- 网络异常处理(超时/断网)

3. **灵活配置**:
- `noShowError` 参数:禁止自动错误提示
- 环境变量管理 API 地址
- 支持特殊响应类型(如 blob)

4. **错误处理**:
- 分类处理网络错误/业务错误
- 自动显示友好错误提示
- 401 自动跳转登录页

### 最佳实践建议:
1. **环境配置**:在 `.env.development` 和 `.env.production` 中配置不同的 `VUE_APP_BASE_API`
2. **错误处理**:可在拦截器中添加错误日志上报
3. **重试机制**:可在响应拦截器中添加请求重试逻辑
4. **取消请求**:添加请求取消功能(使用 axios CancelToken)
5. **文件上传**:单独封装上传方法,处理进度事件

通过这种封装方式,可以实现:
- 统一处理认证逻辑
- 减少重复代码
- 集中管理 API 错误
- 增强请求的可控性
- 快速适配后端接口变更

http://www.xdnf.cn/news/1318555.html

相关文章:

  • 计算机网络 Session 劫持 原理和防御措施
  • 给纯小白的Python操作 PDF 笔记
  • 【算法】模拟专题
  • nertctl使用了解
  • B站 韩顺平 笔记 (Day 21)
  • Windows平台Frida逆向分析环境完整搭建指南
  • 机器学习05-朴素贝叶斯算法
  • 攻防世界—unseping(反序列化)
  • python的邮件发送及配置
  • 逆向Shell实战——红队技巧 vs 蓝队防御全攻略
  • Matlab数字信号处理——基于最小均方误差(MMSE)估计的自适应脉冲压缩算法复现
  • React 基础实战:从组件到案例全解析
  • Mysql笔记-错误条件\处理程序
  • 【Java后端】Spring Boot 集成 MyBatis 全攻略
  • 【前端基础】19、CSS的flex布局
  • 麒麟V10静默安装Oracle11g:lsnrctl、tnsping等文件大小为0的解决方案
  • 【编程实践】关于S3DIS数据集的问题
  • 官方正版在线安装office 365安装工具
  • react 错误边界
  • Linux系统分析 CPU 性能问题的工具汇总
  • STM32学习笔记13-通信协议I2CMPU6050
  • 海洋牧场助力可持续发展,保护海洋生态平衡
  • C语言学习笔记之文件操作
  • 基于Vue的个人博客网站的设计与实现/基于node.js的博客系统的设计与实现#express框架、vscode
  • 网络原理与编程实战:从 TCP/IP 到 HTTP/HTTPS
  • C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
  • 01数据结构-插入排序
  • 如何让AI视频模型(如Veo)开口说中文?一个顶级提示词的深度拆解
  • RabbitMQ入门:生产者和消费者示例
  • 44.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(三)