100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Vue开发问题——axios二次封装 请求 响应拦截器。

Vue开发问题——axios二次封装 请求 响应拦截器。

时间:2024-03-04 19:25:28

相关推荐

Vue开发问题——axios二次封装 请求 响应拦截器。

关于Vue开发的问题(axios二次封装)

在博客中查找vue的axios封装,发现其中案例还是很多的,自己项目中有些需求不够。

比如

1、Content-Type 请求头 application/x-www-form-urlencoded和application/json两种方式的应用

2、请求方式增加delete方式,

3、出现跨域,以及其他问题。

做了些修改。做个记录

首先放出引用的源代码

引用来源于 vue axios 封装 全局调用axios

感谢 爱吃排骨 给予的帮助

import axios from "axios"import qs from "qs"axios.defaults.timeout=3000 //响应时间axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头axios.defaults.baseURL =process.env.NODE_HOST; //配置接口地址console.log(process.env)//POST传参序列化(添加请求拦截器)axios.interceptors.request.use((config) => {//在发送请求之前做某件事let token = sessionStorage.getItem('access_token') || "" //获取token console.log(token)if (token!="") {config.headers = {'access-token': token,'Content-Type': 'application/x-www-form-urlencoded'}} if(config.method === 'post'){config.data = qs.stringify(config.data)//序列化post 参数}return config;},(error) =>{console.log('错误的传参')return Promise.reject(error);});//返回状态判断(添加响应拦截器)axios.interceptors.response.use((res) =>{//对响应数据做些事if(!res.data.success){let newToken=res.data.token //成功后更新token localStorage.setItem('access_token', newToken)}return res;}, (error) => {if(error.response.data.status=='401'){//如果token 过期 则跳转到登录页面this.$router.push('/login');}return Promise.reject(error);});//返回一个Promise(发送post请求)function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}//返回一个Promise(发送get请求)function get(url, param) {return new Promise((resolve, reject) => {axios.get(url, {params: param}).then(response => {resolve(response)}, err => {reject(err)}).catch((error) => {reject(error)})})}export default {get,post,}

直接粘贴过去使用的问题 — 。—!

1、第4行请求头的的问题

2、第5行env文件未说明如何应用

3、第14行,token 名称的问题

4、第18行,当随意使用qs进行转序列化post参数 ,参数有时候想在body又有时候想在url的问题

5、新加delete,download下载方式

6、响应拦截器的修改

1、第4行请求头的的问题

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

这里看到他是给axios添加默认的请求头为:'application/x-www-form-urlencoded;'本身这样写是没有错误的,但是只是默认了提交方式为表单提交,如果我们请求传输数据呢?就必须改为'application/json'

所以…为了能正常使用我又create另外一个axios2

let axios2 = axios.create()axios2.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'; //配置请求头

问题来了,万一get方式的请求头也是这,咋办,所以干脆写在请求拦截器里

axios.interceptors.request.use((config) => {//在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || "" //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/x-www-form-urlencoded'}}if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}return config;}, (error) => {console.log('错误的传参')return Promise.reject(error);});

axios2.interceptors.request.use((config) => {////在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || "" //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json;charset=UTF-8'}}return config;}, (error) => {console.log('错误的传参')return Promise.reject(error);});

对!只有axiosaxios2,以及'Content-Type'发生变化,是不是感觉繁琐了很多,没错!但是胜在能用么,如果这个地方写不对,请求会报400,参数错误。稍后我会放出完整版的,需要的直接拉到最下面吧

那么在下面封装get,或者post 的时候,只需要使用两个不同的axios就行。举例:

//返回一个Promise(发送post请求:'Content-Type'为form方式)function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})//返回一个Promise(发送post请求:'Content-Type'为json方式)function jsonpost(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}

有点流水账的意思,还是那句话。。。。。当时能用就行

2、第5行env文件未说明如何应用

这个请参考我的其他博客《Vue开发问题——打包后首页白屏》

3、第14行,token 名称的问题

排骨老哥不地道(可能是我实在太菜),token名称是后端定的,得随时改,所以下面这个地方:'access-token',得换成自己后端的token名称,在1问题中,我封装的拦截器,我的项目里名称是叫authorization'

if (token!="") {config.headers = {'access-token': token,'Content-Type': 'application/x-www-form-urlencoded'}}

4、第18行,当随意使用qs进行转序列化post参数 ,参数有时候想在body又有时候想在url的问题

细心的小伙伴可能发现了,我在封装两种请求拦截器的时候axios,比axios2多了亿点点内容

if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}

所以如果在'application/json'模式下,后端本来设置是在body中获取数据,那么你再qs去转换下,那么等你的就只有400

5、新加delete,download下载方式

直接上代码

function deletefn(url, params) {return new Promise((resolve, reject) => {axios.delete(url+[params]).then(response => {resolve(response)},err => {reject(err)}).catch(err => {reject(err)})});}function download(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params, {responseType: 'blob'}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}

这里注意了,删除的方式我是axios.delete(url+[params]),你们看自己后台的接口,可能会是axios.delete(url+'/'+[params]),这个 / 你们自己把握 [/滑稽]

至于下载请求嘛,是项目中一个导出列表信息的功能,具体请参考我的其他博客《vue开发问题——导出文本流》

6、响应拦截器的修改

axios.interceptors.response.use((res) => {// 对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {console.log(this);router.push('/');}return res;});

作用是如果返回码401(无权限,或session过期)我就利用router去跳转到登录页

原博主设置的是如果登录的成功,就更新token,我这项目不需要,所以就偷个懒,有需要的可以自己试一试

这里有个小插曲,再这里引用router 必须是../比如:

import router from "../router"

最后记得自己封装的方法要export导出哦~

下面是我完整的代码,另外,还会附上axios封装简化版解决上述的'Content-Type'问题

import axios from "axios"import qs from "qs"import router from "../router"let axios2 = axios.create()axios.defaults.timeout = 7000 //响应时间axios2.defaults.timeout = 7000axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头axios.defaults.baseURL = process.env.VUE_APP_BASE_API; //配置接口地址根目录axios2.defaults.baseURL = process.env.VUE_APP_BASE_API;// //POST传参序列化(添加请求拦截器)axios.interceptors.request.use((config) => {//在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || "" //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/x-www-form-urlencoded'}}if (config.method === 'post') {config.data = qs.stringify(config.data)//序列化post 参数}return config;}, (error) => {console.log('错误的传参')return Promise.reject(error);});// 返回状态判断(添加响应拦截器)axios.interceptors.response.use((res) => {// //对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {router.push('/');}return res;});axios2.interceptors.request.use((config) => {////在发送请求之前做某件事 //请求之前加入tokenlet token = sessionStorage.getItem("token") || "" //获取token if (token != "") {config.headers = {'authorization': token, //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json;charset=UTF-8'}}return config;}, (error) => {console.log('错误的传参')return Promise.reject(error);});axios2.interceptors.response.use((res) => {// 对响应数据做些事if (res.data&&res.data.code&&res.data.code == 401) {router.push('/');}return res;});//返回一个Promise(发送请求头为application/json的post请求)function jsonpost(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}function jsonget(url, params) {return new Promise((resolve, reject) => {axios2.get(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}function jsondelete(url, params) {return new Promise((resolve, reject) => {axios2.delete(url, {data:params}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}//返回一个Promise(发送post请求)function post(url, params) {return new Promise((resolve, reject) => {axios.post(url, params).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}返回一个Promise(发送get请求)function get(url, param) {return new Promise((resolve, reject) => {axios.get(url, {params: param }).then(response => {resolve(response) }, err => {reject(err) }).catch((error) => {reject(error) })})}function deletefn(url, params) {return new Promise((resolve, reject) => {axios.delete(url+[params]).then(response => {resolve(response)},err => {reject(err)}).catch(err => {reject(err)})});}function download(url, params) {return new Promise((resolve, reject) => {axios2.post(url, params, {responseType: 'blob'}).then(response => {resolve(response);}, err => {reject(err);}).catch((error) => {reject(error)})})}export default {get,post,deletefn,jsonpost,jsonget,jsondelete,download}

在main.js 中引入到vue的原型上,第一行是我的文件夹的路径,名称是request.js

import ajax from './network/request'Vue.prototype.$ajax=ajax

在其他地方调用

简化版

function requset(config){return new Promise((resolve,reject)=>{axios({url:config.url,method:config.method,headers:{'authorization': config.token||'', //写自己后端传回来的token的命名,本项目为 authorization,'Content-Type': 'application/json'||config.headers.Content-Type},params:config.params}).then(res=>{resolve(res)}).catch(err=>{reject(err)})})}

其他地方调用

this.ajax.post('url',params).then((res)=>{console.log("123")}).catch(err=>{console.log(err)})

LoginInternet2(){this.$ajax.requset({url:"/login",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},params:this.params}).then(res =>{console.log(res);}).catch(err => {console.log(err);})},

'authorization': config.token||'',表示如果传入就是使用传入的token,没传就不写,其实这里还可以做个简化的,直接添加拦截器就都解决了。

'Content-Type': 'application/json'||config.headers.Content-Type这个表示如果没穿就是默认json,传入就使用传入的

下面的案例为了方便,参数我就直接写再方法里了,一般是应该在data里面定义config:{…},去传参数的。我懒嘛~

更新(其实是打错了)————————————————————————————————

第1个问题里,上面写的我为了创建axios2.去使用application/json请求头 但是,axios少个2,后面的请求头也打错了 。。囧,原文已经更改了

let axios2 = axios.create()axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头

帮到你的话,点个赞吧d=====( ̄▽ ̄*)b

转载引用请注明/Lazy33/article/details/109400075 Lazy33

(引之我幸~让我们大家创造良好环境,不随便复制粘贴,毕竟程序员们人人皆绅士,是最可爱的! )

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。