axios 拦截器——基本用法及拦截器代码

刺骨的言语ヽ痛彻心扉 2022-10-11 13:44 283阅读 0赞

之前在开发后台管理系统时,都是跟其他同事一起开发,说实在点,就是在别人开发的基础上写页面。。。

现在想把之前没有关注的点拾起来。。

今天看下axios拦截器的用法

vue写代码在做ajax请求时,可以用到axios,具体就相当于请求前进行校验(拦截)响应前进行校验(拦截).

什么是axios

axios 是一个基于Promise 用于浏览器和 nodejsHTTP 客户端。简单的理解就是ajax的封装

它本身具有以下特征:

  1. .从浏览器中创建 XMLHttpRequest
  2. node.js 发出 http 请求
  3. 支持 Promise API
  4. 拦截请求和响应
  5. 转换请求和响应数据
  6. 取消请求
  7. 自动转换JSON数据
  8. 客户端支持防止CSRF/XSRF

axios官网地址:https://www.npmjs.com/package/axios

npm安装方法:

  1. $ npm install axios

axios用法

1.在src目录下创建一个js文件并引入axios

  1. import axios from 'axios'; //引入axios
  2. //下面的两个不一定要引入,看项目在拦截时需要做什么操作,一般都是需要引入store的,因为可以拿到用户的登录信息
  3. import store from '@/store/index';//引入store
  4. import router from '@/router';//引入router

2.创建一个axios实例

  1. let instance = axios.create({
  2. headers:{
  3. 'content-type':'application/x-www-form-urlencoded'
  4. }
  5. })

3.编写请求拦截器

这个拦截器会在你发送请求之前运行,此处请求拦截器的功能是:每次请求前去判断是否有token,如果token存在则在请求头加上这个token,后台会判断这个token是否过期。

  1. // http request拦截器
  2. instance.interceptors.request.use(
  3. config=>{
  4. const token = localStorage.getItem('token');//此处用这个localStorage 也可以用store,因为一般登录后都会将登录信息存储到vuex中,但是如果不存储到localsStorage的话,当前页面刷新时,vuex中的内容会消失。
  5. if(token){
  6. config.headers.authorization = token //请求头加上token
  7. }
  8. return config
  9. },err=>{
  10. return Promise.reject(err);
  11. }
  12. )

4.编写响应拦截器

这个拦截器会在拿到后台接口返回的数据后,进行响应处理。比如数据正确返回是code是200,如果code是500,则需要拦截一下。

  1. instance.interceptors.response.use(
  2. response = {
  3. //拦截响应,做统一处理
  4. if(response.data.code){
  5. switch(response.data.code){
  6. case 1002:
  7. store.state.isLogin = false;//store中有个isLogin表示登录状态,这个视具体情况而定
  8. router.replace({
  9. path:'login',
  10. query:{
  11. redirect:router.currentRoute.fullPath
  12. }
  13. })
  14. }
  15. }
  16. return response
  17. },
  18. //接口错误状态处理,也就是说无响应时的处理
  19. error =>{
  20. return Promise.reject(error.response.status);//接口返回的错误信息
  21. }
  22. )

5.导出实例

  1. export default instance

6.axios的使用

在接口对应的js文件中,使用axios,比如login.js登录相关的接口

  1. import axios from './axios'
  2. /* 验证登录 */
  3. export function handleLogin(data){
  4. return axios.post('/user/login',data)
  5. }

在登录页面就可以直接引入login.js,然后使用handleLogin即可。

  1. <script>
  2. import loginApi from '@/api/login.js'
  3. export default{
  4. data(){ },
  5. created(){
  6. loginApi({ xxx}).then(res=>{
  7. console.log(res);
  8. }).catch(err=>{
  9. console.log(err);
  10. })
  11. }
  12. }
  13. </script>

下面附录一个我第一份vue前端工作时,大神的代码:

  1. import axios from 'axios';
  2. import router from '@/router/routers';
  3. import { Notification,MessageBox,Loading} from 'element-ui';
  4. import store from '../store'
  5. import { getToken} from '@/utils/auth'
  6. import Config from '@/setting'
  7. var qs = require('qs')//qs主要是用于处理formData的数据
  8. //创建 axios实例
  9. const service = axios.create({
  10. baseURL:process.env.NODE_ENV ==='production'?process.env.VUE_APP_BASE_API:'/',//api的base_url
  11. timeout:Config.timeout //请求时间
  12. })
  13. let loadingInstance
  14. //request拦截器
  15. service.interceptors.request.use(
  16. config=>{
  17. if(getToken()){
  18. config.headers['Authorization'] = getToken() //让每个请求携带自定义的token,请根据实际情况自行修改
  19. }
  20. config.headers['Content-Type'] = 'application/json'
  21. //这个headers头部的Content-Type:一般都是application/json,但是也有部分接口需要传递的是formData格式的,此时就需要用到qs,为了做区分,在config参数中添加一个type变量来进行判断处理
  22. if(config.type && config.type == 'form'){
  23. config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
  24. if(config.data){
  25. config.data = qs.stringify(config.data);
  26. }
  27. }
  28. if(config.loading){
  29. loadingInstance = Loading.service({ fullscreen:true})
  30. }
  31. return config
  32. },
  33. error =>{
  34. console.log(error);
  35. Promise.reject(error);
  36. }
  37. )
  38. //response拦截器
  39. service.interceptors.response.use(
  40. response =>{
  41. const code = response.status
  42. if(code<200 ||code>300){
  43. Notification.error({
  44. title:response.message
  45. })
  46. if(loadingInstance){
  47. loadingInstance.close();
  48. }
  49. return Promise.reject('error')
  50. }else{
  51. if(loadingInstance){
  52. loadingInstance.close();
  53. }
  54. return response.data
  55. }
  56. },
  57. error =>{
  58. let code = 0
  59. try{
  60. code = error.response.data.status
  61. }catch(e){
  62. if(error.toString().indexOf('Error:timeout') !==-1){
  63. Notification.error({
  64. title:"网络请求超时",
  65. duration:5000
  66. })
  67. return Promise.reject(error)
  68. }
  69. }
  70. if(code){
  71. if(code==401){
  72. MessageBox.confirm(
  73. '登录状态已过期,您可以继续留在该页面,或者重新登录',
  74. '系统提示',
  75. {
  76. confirmButtonText:'重新登录'
  77. cancelButtonText:'取消',
  78. type:'warning'
  79. }
  80. ).then(()=>{
  81. store.dispatch('Login').then(()=>{
  82. location.reload();//为了重新实例化vue-router对象
  83. })
  84. })
  85. }else if(code==405){
  86. router.push({ path:'/401'})
  87. }else{
  88. const errorMsg = error.response.data.message
  89. if(errorMsg !== undefined){
  90. Notification.error({
  91. title:errorMsg,
  92. duration:5000
  93. })
  94. }
  95. }
  96. }else{
  97. Notification.error({
  98. title:'接口请求失败',
  99. duration:5000
  100. })
  101. }
  102. return Promise.reject(error)
  103. }
  104. )
  105. export default service

接口文件的内容:

  1. import request from '@/utils/request'
  2. //get请求的写法:
  3. export function getShopList(data, loading) {
  4. // eslint-disable-next-line no-return-assign
  5. return get('api/shop/list', data, loading)
  6. }
  7. //post请求的写法:
  8. export function modifyAdmin(data) {
  9. return request({
  10. url: 'api/shop/modify/admin',
  11. method: 'post',
  12. data
  13. })
  14. }
  15. //formData格式的post请求的写法:
  16. export function verify(data) {
  17. return request({
  18. type: 'form',
  19. url: 'api/shop/verify',
  20. method: 'post',
  21. data
  22. })
  23. }

vue页面中使用接口的部分内容:

  1. import { verify } from '@/api/shop'
  2. ...
  3. methods:{
  4. verify(this.verifyObj).then(res => {
  5. ....
  6. }).catch(error => {
  7. ...
  8. })
  9. }

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue axios拦截介绍

    axios的拦截器是一个作用非常大,非常好用的东西。分为请求拦截器和响应拦截器两种。 我一般把拦截器写在main.js里。 1. 请求拦截器 请求拦截器的作用是在请

    相关 axios拦截使用方法

    vue中axios获取后端接口数据有时候需要在请求开始时显示loading,请求结束后隐藏loading,这时候到每次调接口时都写上有点繁琐,有时候还会漏写。 这时候axio