1、前端网络请求封装、异常统一处理

vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作;

axios 请求封装

//  引入axios文件包
import axios from 'axios' // POST 方法封装 (参数处理) export const postRequest = (url, params) => { return axios({ method: 'post', url: url, data: params, transformRequest: [function (data) { let ret = '' for (let it in data) { ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' } return ret }], headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); } // POST 方法封装 (文件上传) export const uploadFileRequest = (url, params) => { return axios({ method: 'post', url: url, data: params, headers: { 'Content-Type': 'multipart/form-data' } }); } // GET 方法封装 export const getRequest = (url) => { return axios({ method: 'get', url: url }); } // PUT 方法封装 export const putRequest = (url, params) => { return axios({ method: 'put', url: url, data: params, transformRequest: [function (data) { let ret = '' for (let it in data) { ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&' } return ret }], headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); } // DELETE 方法封装 export const deleteRequest = (url) => { return axios({ method: 'delete', url: url }); } 

2)axios请求异常统一处理

// 引入依赖包
import axios from 'axios' import {Message} from 'element-ui' // REQUEST 请求异常拦截 axios.interceptors.request.use(config=> { //========== 所有请求之前都要执行的操作 ============== return config; }, err=> { //================== 错误处理 ==================== Message.error({message: '请求超时!'}); return Promise.resolve(err); }) // RESPONSE 响应异常拦截 axios.interceptors.response.use(data=> { //============== 所有请求完成后都要执行的操作 ================== // 第一种方式 // 根据返回的code值来做不同的处理(和后端约定) switch (data.code) { case '0': // exp: 修复iPhone 6+ 微信点击返回出现页面空白的问题 if (isIOS()) { // 异步以保证数据已渲染到页面上 setTimeout(() => { // 通过滚动强制浏览器进行页面重绘 document.body.scrollTop += 1 }, 0) } // 这一步保证数据返回,如果没有return则会走接下来的代码,不是未登录就是报错 return data // 需要重新登录 case 'SHIRO_E5001': // 微信生产环境下授权登录 if (isWeChat() && IS_PRODUCTION) { axios.get(apis.common.wechat.authorizeUrl).then(({ result }) => { location.replace(global.decodeURIComponent(result)) }) } else { // 否则跳转到h5登录并带上跳转路由 const search = encodeSearchParams({ next: location.href, }) location.replace(`/user/login`) } // 不显示提示消息 data.description = '' break default: } // 若不是正确的返回code,且已经登录,就抛出错误 const err = new Error(data.description) err.data = data err.response = response // 第二种方式,仅对200和error状态处理 if (data.status && data.status == 200 && data.data.status == 'error') { Message.error({message: data.data.msg}); return; } return data; }, err=> { //============== 错误处理 ==================== if (err && err.response) { switch (err.response.status) { case 400: err.message = '请求错误(400)'; break; case 401: err.message = '未授权,请重新登录(401)'; break; case 403: err.message = '拒绝访问(403)'; break; case 404: err.message = '请求出错(404)'; break; case 408: err.message = '请求超时(408)'; break; case 500: err.message = '服务器错误(500)'; break; case 501: err.message = '服务未实现(501)'; break; case 502: err.message = '网络错误(502)'; break; case 503: err.message = '服务不可用(503)'; break; case 504: err.message = '网络超时(504)'; break; case 505: err.message = 'HTTP版本不受支持(505)'; break; default: err.message = `连接出错(${err.response.status})!`; } } else { err.message = '连接服务器失败!' } Message.err( {message: err.message } ) return Promise.resolve(err); }) 

请求出错的时候我执行的是:Promise.resolve(err);,而不是Promise.reject(err);,这样无论请求成功还是失败,在成功的回调中都能收到通知

2、VUE 项目中使用该方法

1)在main.js中导入所有请求方法

//  导入所有请求方法
import {getRequest} from './utils/api' import {postRequest} from './utils/api' import {deleteRequest} from './utils/api' import {putRequest} from './utils/api' 

2)将请求方法添加至 Vue.prototype 上

//  向VUE的原型上添加请求方法
Vue.prototype.getRequest = getRequest;
Vue.prototype.postRequest = postRequest;
Vue.prototype.deleteRequest = deleteRequest;
Vue.prototype.putRequest = putRequest;

3)发送请求(请求方法的调用)

//  发送网络请求
this.postRequest('/login', {userName,password}).then(resp=> { ... } }); 

4)案例

import Vue from 'vue'
import cypressIndex from '../components/rootVue/cypressIndex' import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; // axios请求的方法引入 import {getRequest} from '../components/utils/settings' import {postRequest} from '../components/utils/settings' Vue.use(ElementUI); // 将axios方法添加到VUE原型上 Vue.prototype.getRequest = getRequest; Vue.prototype.postRequest = postRequest; Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#cypressIndex', render: h => h(cypressIndex) })

转载于:https://www.cnblogs.com/azhqiang/p/9887622.html

vue_axios请求封装、异常拦截统一处理相关推荐

  1. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理

    1.前端网络请求封装.异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作: axios 请求封装 // ...

  2. 【 微信小程序请求封装】【进阶版】处理401请求token过期--重新登录--重新发起刚才过期的请求

    微信小程序请求封装(拦截器):处理请求过期–重新登录–重新发起刚才过期的请求 env.js //这里使用的接口呢都是自己模拟的,可以根据自己的需求进行添加module.exports={//开发环境的 ...

  3. 【springboot异常处理】用异常信息枚举类处理异常,使用自定义异常封装异常对象,返回统一异常处理结果

    1.目录: 异常信息枚举类 自定义异常类 自定义响应数据 全局异常处理类 测试 总结 异常信息枚举类 由于在业务中,有很多异常,针对不同的业务,可能给出的提示信息不同,所以为了方便项目异常信息管理,我 ...

  4. Spring Boot【定制化】~ AOP统一结果处理以及异常拦截

    1.简介 用处:统一结果处理与异常拦截. 2.配置步骤 2.1.创建一个spring boot项目(idea) 完整项目结构! 2.2.导入依赖(需要使用到简化环境搭建) <!-- Spring ...

  5. vue拦截器及请求封装

    1.vue项目的src文件夹中创建request文件夹 (1)request文件夹中创建index.js (拦截器主要代码) /*** 请求封装*/import axios from 'axios'; ...

  6. Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理

    Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 参考文章: (1)Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 ( ...

  7. SpringBoot-@ControllerAdvice 拦截异常并统一处理

    SpringBoot-@ControllerAdvice 拦截异常并统一处理 参考文章: (1)SpringBoot-@ControllerAdvice 拦截异常并统一处理 (2)https://ww ...

  8. Vue3(撩课学院)笔记09-axios简介,发起get请求的两种方式,发起带参的get及post请求,发起并发请求,并发请求结果将数组展开,axios全局配置,axios配置及封装,请求和响应拦截

    1.axios简介 axios是基于promise可以用于浏览器和node.js的网络请求库,在服务器端使用原生node.js,在浏览气短使用ajax(即XMLHttpRequests) 2.axio ...

  9. axios请求封装(带拦截器)

    请求封装二(带拦截器) //请求 import service from '../utils/requst' export function hlserver(){return new Promise ...

最新文章

  1. 【网络编程】非阻塞connect详解
  2. 刻意练习:Python基础 -- Task05. 函数与Lambda表达式
  3. 实用技巧:Excel中的常见问题以及解决方法
  4. 组件化开发,制作Cocoapods Git库
  5. Java中对象的三种状态
  6. tomcat(19)Manager应用程序的servlet类
  7. vb.net datagridview数据批量导入sql_【自学C#】|| 笔记 44 ComboBox:组合框控件数据绑定...
  8. 北京房租到底有多高? | 爬取北京海淀区一居室租房信息
  9. 图论 —— 生成树 —— 次小生成树
  10. YII 规则rule 里面 min,max 提示错误信息
  11. 库克笑嘻嘻!苹果明年或将迎来继iPhone 6后第二次换机大潮
  12. 50 years, 50 colors HDU - 1498(最小点覆盖或者说最小顶点匹配)
  13. 无线系列-无线通信系统组成
  14. java数据过载,处理服务器过载的三大解决方法
  15. xmos固件u8_XU208 USB数字界面 XMOS U8升级版 模块_便宜推
  16. leetcode 1925. Count Square Sum Triples(python)
  17. 聚类分析在用户行为中的实例_聚类分析的简单案例
  18. 网络篇 网络设备的基本配置09
  19. 考研数学高数1-1综合测试-函数及其性质
  20. Xilinx Vitis 2020.1里面运行C程序时提示找不到microblaze_0

热门文章

  1. java 状态模式 重试_java状态模式
  2. Node.js npm
  3. pytorch torch.full
  4. read fread open fopen write fwrite
  5. docker 镜像命令
  6. python3flask教程_全面的Flask教程[3大部分]
  7. 基于物联网的新型智能家居控制系统设计
  8. 101个免费的VMware工具
  9. Java基础学习总结(119)——Java8 JVM与Java7 JVM比较
  10. Linux学习总结(41)——运维不仅仅是Linux