热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

之前在开发后台管理系统时,都是跟其他同事一起开发,说实在点,就是在别人开发的基础上写页面。。。现在想把之前没有关注的点拾起来。。今天看下axios拦截器的用法用vue写代码在做aj



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

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

今天看下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安装方法:

$ npm install axios

axios用法


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

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

2.创建一个axios实例

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

3.编写请求拦截器

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

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

4.编写响应拦截器

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

instance.interceptors.response.use(
respOnse= {
//拦截响应,做统一处理
if(response.data.code){
switch(response.data.code){
case 1002:
store.state.isLogin = false;//store中有个isLogin表示登录状态,这个视具体情况而定
router.replace({
path:'login',
query:{
redirect:router.currentRoute.fullPath
}
})
}
}
return response
},
//接口错误状态处理,也就是说无响应时的处理
error =>{
return Promise.reject(error.response.status);//接口返回的错误信息
}
)

5.导出实例

export default instance

6.axios的使用

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

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

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


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

import axios from 'axios';
import router from '@/router/routers';
import {Notification,MessageBox,Loading} from 'element-ui';
import store from '../store'
import {getToken} from '@/utils/auth'
import Config from '@/setting'
var qs = require('qs')//qs主要是用于处理formData的数据
//创建 axios实例
const service = axios.create({
baseURL:process.env.NODE_ENV ==='production'?process.env.VUE_APP_BASE_API:'/',//api的base_url
timeout:Config.timeout //请求时间
})
let loadingInstance
//request拦截器
service.interceptors.request.use(
cOnfig=>{
if(getToken()){
config.headers['Authorization'] = getToken() //让每个请求携带自定义的token,请根据实际情况自行修改
}
config.headers['Content-Type'] = 'application/json'
//这个headers头部的Content-Type:一般都是application/json,但是也有部分接口需要传递的是formData格式的,此时就需要用到qs,为了做区分,在config参数中添加一个type变量来进行判断处理
if(config.type && config.type == 'form'){
config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
if(config.data){
config.data = qs.stringify(config.data);
}
}
if(config.loading){
loadingInstance = Loading.service({fullscreen:true})
}
return config
},
error =>{
console.log(error);
Promise.reject(error);
}
)
//response拦截器
service.interceptors.response.use(
respOnse=>{
const code = response.status
if(code<200 ||code>300){
Notification.error({
title:response.message
})
if(loadingInstance){
loadingInstance.close();
}
return Promise.reject('error')
}else{
if(loadingInstance){
loadingInstance.close();
}
return response.data
}
},
error =>{
let code = 0
try{
code = error.response.data.status
}catch(e){
if(error.toString().indexOf('Error:timeout') !==-1){
Notification.error({
title:"网络请求超时",
duration:5000
})
return Promise.reject(error)
}
}
if(code){
if(code==401){
MessageBox.confirm(
'登录状态已过期,您可以继续留在该页面,或者重新登录',
'系统提示',
{
confirmButtonText:'重新登录',
cancelButtonText:'取消',
type:'warning'
}
).then(()=>{
store.dispatch('Login').then(()=>{
location.reload();//为了重新实例化vue-router对象
})
})
}else if(code==405){
router.push({path:'/401'})
}else{
const errorMsg = error.response.data.message
if(errorMsg !== undefined){
Notification.error({
title:errorMsg,
duration:5000
})
}
}
}else{
Notification.error({
title:'接口请求失败',
duration:5000
})
}
return Promise.reject(error)
}
)
export default service

接口文件的内容:

import request from '@/utils/request'
//get请求的写法:
export function getShopList(data, loading) {
// eslint-disable-next-line no-return-assign
return get('api/shop/list', data, loading)
}
//post请求的写法:
export function modifyAdmin(data) {
return request({
url: 'api/shop/modify/admin',
method: 'post',
data
})
}
//formData格式的post请求的写法:
export function verify(data) {
return request({
type: 'form',
url: 'api/shop/verify',
method: 'post',
data
})
}

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

import { verify } from '@/api/shop'
...
methods:{
verify(this.verifyObj).then(res => {
....
}).catch(error => {
...
})
}


推荐阅读
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • 在本文中,我们将探讨如何使用 UniApp 封装小程序 API 请求接口的最佳实践。通过创建 `request.js` 文件,定义基础 URL 并传入后端提供的 URL 作为请求参数。同时,配置请求方法(如 GET、POST)和请求头(例如包含 token 的认证信息),以实现高效、安全的 API 调用。此外,我们还将介绍如何处理请求和响应的错误,以及如何优化请求性能,确保应用在不同平台上的兼容性和稳定性。 ... [详细]
  • 本文将深入探讨FastJSON的基础解析机制与自定义JSON处理技巧。通过详细分析FastJSON的核心功能和高级用法,帮助读者掌握高效、灵活的JSON数据处理方法。文中还将分享一些实用的代码示例和最佳实践,助力开发者在实际项目中更好地应用FastJSON。 ... [详细]
  • 微信支付授权目录配置详解及操作步骤
    在使用微信支付时,若通过WeixinJSBridge.invoke方法调用支付功能,可能会遇到“当前页面URL未注册”的错误提示,导致get_brand_wcpay_request:fail调用微信JSAPI支付失败。为解决这一问题,需要正确配置微信支付授权目录,确保支付页面的URL已成功注册。本文将详细介绍微信支付授权目录的配置步骤和注意事项,帮助开发者顺利完成支付功能的集成与调试。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
author-avatar
卡瑙娇管
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有