uniapp小程序(请求拦截器和路由拦截器)

1、路由拦截器

let config = {
	//不需要登录的页面,白名单
	whiteList: [
		"/pages/welcome/welcome",
		"/pages/getPhone/getPhone",
		"/pages/invitation_homeAll/invitation_homeAll",
		"/pages/invitation_getPhone/invitation_getPhone",
		//......
	],
	//登录页
	loginPage: "/pages/getPhone/getPhone"
}
export default function initApp() {
	/**
	 * 页面跳转拦截器
	 */
	let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"];
	list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器
		uni.addInterceptor(item, {
			invoke(e) { // 调用前拦截
				//获取用户的token
				const token = uni.getStorageSync('token'),

					//获取要跳转的页面路径(url去掉"?"和"?"后的参数)
					url = e.url.split('?')[0];
				let notNeed = config.whiteList.includes(url)
				// 如果在whiteList里面就不需要登录
				if (notNeed) {
					return e
				} else {

					//需要登录
					if (!token) {
						uni.navigateTo({
							url: config.loginPage
						})
						return false
					} else {
						return e
					}
				}

			},
			fail(err) { // 失败回调拦截 
				console.log(err);

			}
		})
	})


}

2、请求拦截器

post(url, data, headerValue) {
		return new Promise((resolve, reject) => {
			uni.request({
				url: apiSystem + url,
				data: data,
				header: {
					'content-type': 'application/x-www-form-urlencoded', //自定义请求头信息
					'token': headerValue
				},
				method: 'POST',
			}).then((response) => {
				let [error, res] = response;
				resolve(res);


			}).catch(error => {
				let [err, res] = error;
				reject(err)

			})
			//token的请求拦截器
			uni.addInterceptor('request', {
				success(args) {

					if (args.data.code == 500 && args.data.msg == '未找到token对应的用户' || args.data.msg ==
						'header缺失:token') {
						let pages = getCurrentPages(); //获取所有页面栈实例列表
						let prevPage = pages[pages.length - 1]; //上一页页面实例
						console.log('prevPage.$page.fullPath>>' + prevPage.$page.fullPath)
						//防止多次拦截请求时,多次跳转登录页

						if (prevPage.$page.fullPath != '/pages/getPhone/getPhone') {
							uni.navigateTo({
								url: '/pages/getPhone/getPhone'
							})
							return false
						}

					}
				}
			})

		})

	},

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
微信小程序请求拦截器可以在使用 wx.request 发起请求之前,对请求进行拦截和处理。你可以通过以下步骤来实现请求拦截器: 1. 在 app.js 或者需要使用请求拦截器的页面中,定义一个全局变量 interceptorList 来存储拦截器列表: ```javascript App({ // 全局变量 globalData: { interceptorList: [] } }) ``` 2. 创建一个拦截器对象,包含 request 和 response 两个方法。这些方法会在请求发送之前和请求响应之后被调用: ```javascript // 拦截器对象 const interceptor = { // 请求拦截 request: (config) => { // 对请求进行处理,比如添加 token 等 return config; }, // 响应拦截 response: (response) => { // 对响应进行处理,比如处理错误码等 return response; } } ``` 3. 在需要使用拦截器的页面中,将拦截器对象添加到全局变量 interceptorList 中: ```javascript // 获取全局变量 const app = getApp(); // 将拦截器添加到列表中 app.globalData.interceptorList.push(interceptor); ``` 4. 最后,在发起请求的地方使用 wx.request,并在其中执行拦截器的 request 方法: ```javascript wx.request({ // 其他配置项 ... success: (response) => { // 获取全局变量 const app = getApp(); // 遍历拦截器列表,执行响应拦截方法 app.globalData.interceptorList.forEach((interceptor) => { response = interceptor.response(response); }) // 处理响应结果 ... } }) ``` 通过以上步骤,你可以实现微信小程序请求拦截器,对请求和响应进行处理。你还可以根据具体需求,进一步完善拦截器的功能,比如错误统一处理、添加请求头等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值