/utils/request.js
文件是基于 axios 的封装,用于统一处理请求参数、请求头、错误提示信息等。这些功能的封装使得在 Ruoyi Vue 中进行 HTTP 请求时可以更加方便和统一,同时也提高了代码的可维护性和可扩展性。下面是对这些功能的具体描述:
- 全局 request 拦截器:在请求发送前会执行的拦截器,可以在这里统一设置请求头部信息等。
// request拦截器
service.interceptors.request.use(config=>{// 是否需要设置 tokenconst isToken =(config.headers ||{}).isToken ===false// 是否需要防止数据重复提交const isRepeatSubmit =(config.headers ||{}).repeatSubmit ===falseif(getToken()&&!isToken){
config.headers['Authorization']='Bearer '+getToken()// 让每个请求携带自定义token 请根据实际情况自行修改}// get请求映射params参数if(config.method ==='get'&& config.params){let url = config.url +'?'+tansParams(config.params);
url = url.slice(0,-1);
config.params ={};
config.url = url;}if(!isRepeatSubmit &&(config.method ==='post'|| config.method ==='put')){const requestObj ={url: config.url,data:typeof config.data ==='object'?JSON.stringify(config.data): config.data,time:newDate().getTime()}const requestSize = Object.keys(JSON.stringify(requestObj)).length;// 请求数据大小const limitSize =5*1024*1024;// 限制存放数据5Mif(requestSize >= limitSize){
console.warn(`[${config.url}]: `+'请求数据大小超出允许的5M限制,无法进行防重复提交验证。')return config;}const sessionObj = cache.session.getJSON('sessionObj')if(sessionObj ===undefined|| sessionObj ===null|| sessionObj ===''){
cache.session.setJSON('sessionObj', requestObj)}else{const s_url = sessionObj.url;// 请求地址const s_data = sessionObj.data;// 请求数据const s_time = sessionObj.time;// 请求时间const interval =1000;// 间隔时间(ms),小于此时间视为重复提交if(s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url){const message ='数据正在处理,请勿重复提交';
console.warn(`[${s_url}]: `+ message)return Promise.reject(newError(message))}else{
cache.session.setJSON('sessionObj', requestObj)}}}return config
},error=>{
console.log(error)
Promise.reject(error)})
- 全局 response 拦截器:在接收到响应后会执行的拦截器,可以在这里统一处理响应数据,比如对错误进行统一处理。
// 响应拦截器
service.interceptors.response.use(res=>{// 未设置状态码则默认成功状态const code = res.data.code ||200;// 获取错误信息const msg = errorCode[code]|| res.data.msg || errorCode['default']// 二进制数据则直接返回if(res.request.responseType ==='blob'|| res.request.responseType ==='arraybuffer'){return res.data
}if(code ===401){if(!isRelogin.show){
isRelogin.show =true;
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录','系统提示',{confirmButtonText:'重新登录',cancelButtonText:'取消',type:'warning'}).then(()=>{
isRelogin.show =false;
store.dispatch('LogOut').then(()=>{const currentUrl = window.location.href
location.href = currentUrl.substring(currentUrl.indexOf("/"))})}).catch(()=>{
isRelogin.show =false;});}return Promise.reject('无效的会话,或者会话已过期,请重新登录。')}elseif(code ===500){Message({message: msg,type:'error'})return Promise.reject(newError(msg))}elseif(code ===601){Message({message: msg,type:'warning'})return Promise.reject('error')}elseif(code !==200){
Notification.error({title: msg })return Promise.reject('error')}else{return res.data
}},error=>{
console.log('err'+ error)let{ message }= error;if(message =="Network Error"){
message ="后端接口连接异常";}elseif(message.includes("timeout")){
message ="系统接口请求超时";}elseif(message.includes("Request failed with status code")){
message ="系统接口"+ message.substr(message.length -3)+"异常";}Message({message: message,type:'error',duration:5*1000})return Promise.reject(error)})
- 统一的错误处理:通过 response 拦截器统一处理错误响应,可以根据错误码在
errorCode.js
中设置对应的错误信息,并进行统一的错误提示或者其他处理。
exportdefault{'401':'认证失败,无法访问系统资源','403':'当前操作没有权限','404':'访问资源不存在','default':'系统未知错误,请反馈给管理员'}
- 超时处理:通过 axios 的配置项可以设置请求超时时间,在超时后可以进行相应的处理。
// 创建axios实例const service = axios.create({// axios中请求配置有baseURL选项,表示请求URL公共部分baseURL: process.env.VUE_APP_BASE_API,// 超时timeout:10000})
- baseURL 设置:可以在这里设置请求的基础 URL,方便统一管理接口地址。 在.env.development或者.env.production或者.env.staging文件里面可以设置:
# 若依管理系统/测试环境
VUE_APP_BASE_API='/stage-api'
版权归原作者 程序员诚哥 所有, 如有侵权,请联系我们删除。