在uniapp中,使用axios进行请求时,uniapp无法使用axios的适配器,需要基于uni.request来定义适配器。

安装完成axios后在项目utils目录下建一个axios文件夹

文中根目录代表utils中的axios文件夹

在根目录新建一个axios.js文件,在该文件中配置一个新的axios

import axios from "axios";
const service = axios.create({
withCredentials: true,
crossDomain: true,
baseURL: '***',
timeout: 6000
})

在根目录建一个lib文件夹,在这个文件夹里建一个adapter.js文件,该文件配置了基于uniapp的axios适配,记得抛出这个适配器


import settle from "axios/lib/core/settle"
import buildURL from "axios/lib/helpers/buildURL" /* 格式化路径 */
const URLFormat = function (baseURL, url) {
return url.startsWith("http") ? url : baseURL
} /* axios适配器配置 */
const adapter = function (config) {
return new Promise((resolve, reject) => {
uni.request({
method: config.method.toUpperCase(),
url: buildURL(URLFormat(config.baseURL, config.url), config.params, config.paramsSerializer),
header: config.headers,
data: config.data,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
complete: function complete(response) {
response = {
data: response.data,
status: response.statusCode,
errMsg: response.errMsg,
header: response.header,
config: config
};
settle(resolve, reject, response);
}
})
})
} export default adapter;

在根目录的axios.js文件中,使用这个适配器并设置重新发起请求的次数以及每次重新请求的间隔时间

import adapter from "./lib/adapter"
service.defaults.adapter = adapter;
service.defaults.retry = 5; // 设置请求次数
service.defaults.retryDelay = 1000;// 重新请求时间间隔

设置一个请求完成后的拦截器,如果响应头中的状态码为200表示成功,将请求得到的数据返回,否则一律视为错误请求,需要返回一个Promise。在lib中建立一个axiosError.js在里面处理失败的请求。

service.interceptors.response.use(res => {
if (res.status == 200) {
return res;
} else {
return Promise.reject(res);
}
}, err => axiosError(err, service))

axiosError.js中需要传入axios拦截器截到的错误以及我们新创建的这个axios,这个错误处理页面只是充当一个分配器的角色,我们可以根据响应头中的状态进行处理该错误,未处理的错误在使用时处理,返回Promise.reject

// 处理401错误代码
import Error401 from "../handlers/401Error"; export default function (err, axios) {
const errStatus = err.response.status;
if (errStatus == 401) {
return Error401(err); // 401没有权限,重新请求设置token
} else {
return Promise.reject(err);
}
}

处理401错误代码,当请求失败并且响应头中的状态码为401时,是我没没有权限去请求,可以根据项目来进行处理,我们是需要携带token,所以401为token未携带或失效,请求时无需传入token,axios遇到401会自动携带这个token重新去请求。在根目录建一个handlers文件夹,在里面建一个401Error.js用于处理401的错误。

这里使用到Vuex,需要引入Vuex,因为获取token、设置token的方法以及token都放在里面!!!使用store.dispatch("getToken")得到token后将token设置到请求头Authorization

import interceptorsError from "../lib/interceptorsError";
import store from 'store/index' /* 需要传入axios错误配置 */
export default function (err, axios) {
const config = err.config;// axios请求配置
store.dispatch("getToken").then(function () {
config.headers["Authorization"] = store.state.cnrToken.cnr_token;
});
err.config = config;
return interceptorsError(axios, config);
}

一切准备就绪之后需要重新请求,在根目录建一个interceptorsError.js文件,用于重新执行请求,这个方法需要一个请求配置,只需要把我们上一个请求的配置传入即可。

export default function (axios, config) {
// 如果配置不存在或未设置重试选项,reject
if (!config || !config.retry) return Promise.reject(err);
// 设置变量以跟踪重试计数
config.__retryCount = config.__retryCount || 0;
// 如果重试次数大于最大重试次数,reject
if (config.__retryCount >= config.retry) {
return Promise.reject(err);
}
// 每重试一次记录一次重试次数
config.__retryCount += 1;
// 重试间隔时间
const backoff = new Promise(function (resolve) {
setTimeout(function () {
resolve();
}, config.retryDelay || 1000);
}); return backoff.then(function () {
return axios(config);
});
}

这是我Vuex中的代码

/*
* @Author: UpYou
* @Date: 2020-09-25 16:30:13
* @LastEditTime: 2020-09-25 21:32:56
* @Descripttion: token
*
*/ const state = {
cnr_token: '',
POST_KEYS: {
...获取token需要的验证信息...
}
}; const mutations = {
/* 设置token */
SET_CNRTOKEN(state, Payload) {
if (Payload.startsWith("Bearer"))
state.cnr_token = Payload;
else state.cnr_token = "Bearer" + Payload;
}
} const actions = {
/* 向服务器获取token */
getToken(context, args) {
return new Promise(function (resolve, reject) {
uni.request({
url: "token服务器地址",
data: { ...context.state.POST_KEYS },
method: "get",
async success(res) {
await context.commit('SET_CNRTOKEN', res.data.access_token)
await resolve(res.data)
},
fail: reject
});
})
}
} export default {
state, mutations, actions,
}

uniapp使用axios以及封装错误重试解决方案的更多相关文章

  1. Java异常错误重试方案研究(转)(spring-retry/guava-retryer)

    业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...

  2. vue中Axios的封装和API接口的管理

    前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习.如果对原博主造成侵犯,我会立即删除. 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题 ...

  3. vue中对axios进行封装

    在刚结束的项目中对axios进行了实践(好不容易碰上一个不是jsonp的项目), 以下为在项目中对axios的封装,仅封装了post方法,因为项目中只用到了post,如有需要请自行进行修改 src/c ...

  4. 大数据技术之_08_Hive学习_05_Hive实战之谷粒影音(ETL+TopN)+常见错误及解决方案

    第10章 Hive实战之谷粒影音10.1 需求描述10.2 项目10.2.1 数据结构10.2.2 ETL原始数据10.3 准备工作10.3.1 创建表10.3.2 导入ETL后的数据到原始表10.3 ...

  5. 聊聊 Vue 中 axios 的封装

    聊聊 Vue 中 axios 的封装 axios 是 Vue 官方推荐的一个 HTTP 库,用 axios 官方简介来介绍它,就是: Axios 是一个基于 promise 的 HTTP 库,可以用在 ...

  6. 三、VUE项目BaseCms系列文章:axios 的封装

    项目开发中 ajax 是不可缺少的,一个好的封装可以减少我们很多的重复代码,维护也更方便.在 vue 开发中我们用的比较多的就是 axios.下面代码是项目中用到的 axios 的封装. http.j ...

  7. vue中axios的封装以及简单使用

    一.axios的封装 在vue中为了使用axios使用方便,不需要每一个模块进行导入,就需要对其进行封装: 1.新建http.js模块 import axios from 'axios' // 设置基 ...

  8. 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案

    提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...

  9. 针对每种Windows Server 操作Excel、Word等Office组件遇到“ComException"、”80070005“等COM错误的解决方案大汇总

    以下所有Excel错误的解决方案,同样适用于Word.PowerPoint等Office产品. 以下解决方案中,如果出现"安装Excel组件",是适用于遇到Excel错误的.如果是 ...

随机推荐

  1. sqli-labs第二关 详解

    学会了第一关,时隔多天来到了第二关,怎么说了没有看wp就给做出来了. 首先,我是自己先判断了下,这个是什么注入 ?id=1' 不行 ?id=1' or '1'='1--+ 也不行 然后又尝试了下 ?i ...

  2. The Python Tutorial 和 documentation和安装库lib步骤

    链接: The Python Tutorial : https://docs.python.org/3.6/tutorial/index.html Documentation: https://doc ...

  3. Matlab中的uigetfile用法

    参考:https://ww2.mathworks.cn/help/matlab/ref/uigetfile.html?searchHighlight=uigetfile&s_tid=doc_s ...

  4. Systemd的权威用法【译】

    如何使用journalctl 来观察和操作systemd的日志 介绍 systemd的一些不错的有点就是它能涉及到进程的系统的日志.对于其他日志工具,日志通常被分布到整个系统中,由不同的daemon和 ...

  5. Oracle缓存表与Oracle缓存的区别

    一.Oracle缓存表 与 Oracle缓存 的概念 Oracle 缓存:是把Oracle近期查询的语句放置在Oracle设定的缓存当中. Oracle 缓存表:是把某个表放置在缓存当中,缓存是Ora ...

  6. Solr单机安装

    Solr单机安装 一.下载 自行到官网下载所需版本即可,我这里使用的是solr-7.1.0solr官网:http://archive.apache.org/dist/lucene/solr/ 二.安装 ...

  7. JDK1.8源码安装

    JDK1.8源码安装 一.先卸载openjdk #查找已安装的版本,若是没有结果,就表示没安装rpm -qa|grep jdkrpm -qa|grep java#有的话卸载 --nodeps卸载相关依 ...

  8. win10简单方法安装杜比v4音效!win10 1909适用!

    先下载这个! 链接: https://pan.baidu.com/s/1zAOOf-1aCJsjBgy36SiGWA 密码: s9n7 这个是杜比V4文件,257MB大小,适用32位64位系统!下 载 ...

  9. 解决:npm install ERR! Unexpected end of JSON input

    npm ERR! Unexpected end of JSON input npm i -g npm@5 npm install --registry=https://registry.npm.tao ...

  10. IDEA 简拼输入

    1. sout = System.out.println(); 2. soutp = System.out.println(""); 3. soutv = System.out.p ...