uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能

这篇具有很好参考价值的文章主要介绍了uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
1、为什么不适用uniapp自带的请求功能?
答:uniapp自带的请求功能,再刷新了令牌后,重新请求返回的数据无法返回给发起请求的方法。也就是说,刷新令牌后重新发起的请求和第一次发起请求的方法是割裂的。
2、封装文件中,我设置了无感刷新令牌功能。我后台的判断逻辑是,当前端请求的令牌过期时间和当前时间比小于10分钟时,刷新令牌。
 

一、安装axios
1.1、使用HBuilder打开uniapp项目,点击视图->显示终端,打开npm操作页面。
1.2、如果项目中还没有“package.json”文件,请先初始化项目。

npm init -y

1.3、安装axios,建议锁定低版本(使用uniapp-vue3版本时,axios的版本需要0.26.0以下)。

npm i axios@0.26.0

 1.4 在main.js中配置axios

import axios from 'axios'//引入axios
import * as request from '@/common/api/request.js'//自定义请求封装文件
Vue.prototype.$http = request //封装的请求方法

// 解决uniapp 适配axios请求,避免报adapter is not a function错误
// 此配置也可以放在自定义请求封装文件中(例如 request.js)
axios.defaults.adapter = config => {
	return new Promise((resolve, reject) => {
		let settle = require('axios/lib/core/settle');
		let buildURL = require('axios/lib/helpers/buildURL');
		uni.request({
			method: config.method.toUpperCase(),
			url: config.baseURL + buildURL(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);
			}
		})
	})
}

二、自定义请求封装文件 request.js,我的文件路径是 /根目录/common/api/request.js。文章来源地址https://www.toymoban.com/news/detail-773195.html

import axios from 'axios' // 引入axios
import store from '@/store/index.js'//引入store仓库

function getToken() { //获取令牌
	let token = store.state.accountValue.accessToken //store仓库中的令牌
	if (!token) { //令牌不存在,显示登录弹窗
		openLoginDialog()
	}
	return token
}

//令牌过期,刷新令牌请求
function refreshToken() {
	return service.get('/account/user/refresh/login').then(res => res)
}

//设置store及微信缓存中的账号信息
function setAccountInfo(accountInfo) {

	store.commit('accountValue/SET_ACCOUNT_INFO', accountInfo) //修改store中的账号信息
	//存储账号信息到微信缓存中
	wx.setStorage({
		key: "userInfo",
		data: JSON.stringify(accountInfo)
	})
}

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const baseUrl = store.state.constantValue.hostUrl + store.state.constantValue.port //域名/地址公共前缀
const appid = store.state.constantValue.appid //小程序的appid
const requestTimeout = store.state.constantValue.requestTimeout //默认的请求超时时间,单位毫秒
const service = axios.create({
	baseURL: baseUrl, //axios的默认请求地址前缀
	timeout: requestTimeout //默认的请求超时时间,单位毫秒
})

let requests = [] // 重试队列数组,把需要刷新令牌的请求都放入这个数组中,每一项将是一个待执行的函数形式

let common = {//默认的请求配置信息
	data: {},
	header: {
		"Content-Type": "application/json",
		"Content-Type": "application/x-www-form-urlencoded"
	},
	method: "GET",
	dataType: "json"
}


// 请求拦截器
service.interceptors.request.use(
	config => {

		// 每次发送请求之前判断vuex中是否存在token
		// 如果存在,则统一在http请求的headers都加上token,这样后台根据token判断你的登录情况
		// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
		config.method = config.method || common.method;
		if (config.method !== 'GET') {
			config.data = config.data || common.data;
		}
		config.dataType = config.dataType || common.dataType;
		config.header = config.header || common.header;

		if (config.header.NeedToken === 'NEED') { //如果需要访问令牌
			const token = getToken();
			!isNull(token) && (config.headers.Authorization = 'Bearer ' + token);
		}

		return config;
	},
	error => {
		return Promise.error(error);
	});


// 响应拦截器
service.interceptors.response.use(
	response => {

		// 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
		// 否则的话抛出错误
		if (response.status === 200) {

			let code = response.data.code //code为自定义的后台响应code

			if (code === 20009 || code === 20010) { //未登录或者登录异常,需要重新登录时
				openLoginDialog()//打开登录弹窗
				return Promise.resolve(response.data); //返回响应结果
			} else {

				if (code === 20017) { //后台要求刷新令牌

					const config = response.config

					if (!store.state.constantValue.isRefreshing) { //如果正在刷新令牌状态为false

						//设置正在刷新令牌状态为true,进入更新令牌阶段
						store.commit('constantValue/SET_IS_REFRESHING', true)

						//获取刷新令牌请求
						return refreshToken().then(res => {

							if (res.code === 20000) {

								// 刷新令牌成功,设置store及微信缓存中的账号信息
								const accountInfo = res.data
								setAccountInfo(accountInfo)

								//已经刷新了令牌,重新发起重试队列数组中的请求
								requests.forEach(cb => cb(accountInfo.accessToken))
								// 完成后清空这个数组
								requests = []

								//重置当前请求的配置,重新发起请求
								config.headers.Authorization = 'Bearer ' + accountInfo.accessToken
								config.baseURL = baseUrl //axios的默认请求地址前缀
								config.timeout = requestTimeout //默认的请求超时时间
								return service(config) //重新发起请求,返回的就是当前请求
							} else {
								openLoginDialog()//打开登录弹窗
							}
						}).catch(rej => { //令牌刷新发生错误
							openLoginDialog()//打开登录弹窗
						}).finally(() => {
							//完成之后设置正在刷新令牌状态为false
							store.commit('constantValue/SET_IS_REFRESHING', false)
						})
					} else { //如果正在刷新令牌状态为true

						if (config.header.NeedToken === 'NEED') { //请求需要令牌

							// 返回一个未执行resolve的promise
							return new Promise((resolve) => {
								// 将resolve放进重试队列数组,用一个函数形式来保存,等令牌刷新后直接执行
								requests.push((token) => {
									config.headers.Authorization = 'Bearer ' + token
									resolve(service(config))
								})
							})

						}
					}
				}
				return Promise.resolve(response.data) //返回响应信息
			}
		} else { //状态码不为200时
			return Promise.reject(response.data) //返回响应异常信息
		}
	},
	error => {
		return Promise.reject(error) //返回响应错误信息
	}
);

export default service;

到了这里,关于uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp及微信小程序封装全局网络请求,弹框和hint提示

    今天分享一下uniapp项目的网络请求如何封装,不知道大家开发微信小程序项目是用什么开发工具,我个人更喜欢用uniapp,无论是从项目扩展方向还是开发效率来说,uniapp都是首选。 1:创建一个项目工具库,http.js 在vite.config.js文件中配置跨域 这样,一个全局网络请求工具就完

    2024年02月06日
    浏览(32)
  • uniapp微信小程序封装网络请求 @escook/request-miniprogram

    官网地址:https://www.npmjs.com/package/@escook/request-miniprogram 1、下载依赖 2、引入 把下面代码放到 main.js 3、发起请求 4、请求成功 可以看到请求成功了,并执行了登入成功的逻辑。 每次发起请求后,都要自己写if语句判断请求是否成功,非常麻烦。我们可以修改一下源码解决这个

    2024年02月10日
    浏览(30)
  • Vue3的axios请求封装,请求拦截,相应拦截

    对于三者放在Service.js中封装,方便使用 axios.create  的作用是创建一个新的  axios  实例,该实例可以具有自定义配置。通过使用  axios.create ,您可以为任何 API 生成一个客户端,并在使用同一客户端的任何调用中重复使用相同的配置。这使得在应用程序中使用多个 API 时更加

    2024年02月03日
    浏览(26)
  • uniapp封装一个网络请求的服务,包括拦截器,请求头等,适用于抖音小程序,各种小程序。

    今天用uniapp写抖音小程序的时候,发现抖音小程序不支持axios(也许是我不会玩哈),那使用uniapp提供的请求方式总是可以的,毕竟uniapp对于小程序的友好度那是真没的说呀。那每个请求都写一套请求代码也太麻烦了,封装一个服务吧。直接上代码,我们把下面这个文件叫做

    2024年02月07日
    浏览(34)
  • 【axios网络请求库】认识Axios库;axios发送请求、创建实例、创建拦截器、封装请求

    功能特点: 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 http请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 支持多种请求方式: axios(config) axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(url[, data[, config]]) axios.put(url[, data[, c

    2024年02月10日
    浏览(33)
  • 微信小程序:axios请求小程序登录返回错误码41002

    记一次开发中遇到的很愚蠢的错误,很久没有碰过小程序开发了,曾经用php写过小程序的后端,现在想用基于node的express框架做后端,开发一款自己专属的小程序,结果出师不利,使用axios请求小程序登录模块,返回41002错误代码,如下图所示: 这个就很难受了,然后尝试用微

    2024年02月12日
    浏览(30)
  • 微信小程序封装请求

    封装请求 解决的问题 很多页面中请求的 url 前半部分都是一样的,重复书写导致页面代码冗余复杂同时逻辑容易不清晰,所以采用单独将请求封装成一个文件(模块)使得这些问题得到解决。 前期基础知识 uni.request(wx.request) Promise 具体步骤 创建文件夹及文件 在根目录下

    2024年02月11日
    浏览(35)
  • 微信小程序网络请求封装

    网络请求地址放到url.js中,分别制定开发环境,体验环境,线上环境 网络请求的方法放到request.js中,暴露get、post、wxLogin方法 请求前显示加载中,请求结束后隐藏加载中 请求的接口方法,放到api.js中,并调用request.js中对应的方法 2.1 请求地址(url.js) 2.3 具体的请求方法(api.

    2024年02月15日
    浏览(28)
  • 微信小程序 封装request请求

    创建 utils 文件夹后创建 api 文件夹创建 request.js 创建 index.js

    2024年02月15日
    浏览(39)
  • uniapp微信小程序使用axios(vue3+axios+ts版)

    \\\"vue\\\": \\\"^3.2.45\\\",  \\\"axios\\\": \\\"^1.4.0\\\",  \\\"axios-miniprogram-adapter\\\": \\\"^0.3.5\\\", yarn add axios axios-miniprogram-adapter 在 utils 创建 utils/request.ts 文件 在 src 目录下创建 src/api/config 文件夹 config文件夹中创建home.ts文件,首页的接口都放在里面统一管理  和 config 文件夹同级创建home.ts文件,统一管理请求

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包