uni-app 接口封装,token过期,自动获取最新的token

一、文件路径截图

        

2、新建一个文件app.js

let host = 'http://192.168.1.29:8080/jeecg-boot/'
let myApi = {
	login: `${host}wx/wxUser/login`, //登录
}
module.exports = myApi

3、新建一个文件request.js
        

import myApi from '@/utils/app.js';
export const request = (options) => {
	return new Promise((resolve, reject) => {
		const token = uni.getStorageSync('token');
		if (!options.url) {
			console.error('请传入URL')
			return;
		}
		if (!token) {
			wxlogin(options).then(() => {
				sendRequest(options, resolve, reject, 0);
			}).catch(reject);
			return;
		}
		sendRequest(options, resolve, reject, 0);

	})
};
function sendRequest(options, resolve, reject, retryCount) { //封装的发送请求函数
    const token = uni.getStorageSync('token');
    uni.request({
        url: options.url,
        data: options.data || {},
        method: options.method || 'POST',
        header: {
            "X-Access-Token": token,
        },
        timeout: 10000, // 设置请求超时时间为10秒
        success: (res) => {
            if (res.data.code === 401) { // HTTP状态码401表示未授权
                // 此处设置最多重新发送2次请求,防止无限循环
                if (retryCount < 2) {
                    wxlogin(options).then(() => {
                        sendRequest(options, resolve, reject, ++retryCount); // 重发请求
                    }).catch(reject);
                } else {
                    reject(res.data);
                }
            } else {
                // 请求成功,解析结果
                resolve(res.data);
            }
        },
        fail: (err) => {
            // 请求失败,抛出错误
            reject(err);
        }
    });
}
export async function wxlogin(options) { //封装的登录 登陆成功后获取信息
	return new Promise((resolve, reject) => {
		uni.getUserInfo({
			success: (UserRes) => {
				uni.login({
					desc: 'weixin',
					success: res => {
						// console.log(res, 'code');
						wx.request({
							url: myApi.login,
							method: 'POST',
							data: {
								weappCode: res.code,
								encryptedData: UserRes.encryptedData,
								iv: UserRes.iv
							},
							success: res => {
								console.log(res, '登录');
								if (res.data.success) {
									const userName = res.data.result
									uni.setStorageSync('token', userName
										.token);
									uni.setStorageSync('WXUSER',
										userName.wxUser);
									resolve(); // 登录成功后,返回resolve
								} else {
									console.log('登录错误', res);
									reject(); // 登录失败时,返回reject
								}
							}
						});
					}
				});
			}
		});
	});
}

4、页面使用
        

<!-- 首页 -->
<template>
	
</template>

<script>
	import myApi from '@/utils/app.js' //调用接口使用
	export default {
		components: {
			
		},
		data() {
			return {
				dataSource: [],
			};
		},
		onLoad() {
			this.loadData()
		},
		
		methods: {
			async loadData() {
				this.loading = true
				try {
					const res = await this.$request({
						url: myApi.queryList,
						method: 'GET',
						data: {} ,// 传递的值
					});
					if (res.code == 200) {
						this.dataSource = res.result.records
					}
				} catch (e) {
					// 失败执行
					console.log(`这个接口错误:${myApi.queryList}`)
				} finally {
					// 销毁执行
					this.loading = false
				}
			},
			
		}
	};
</script>

<style lang="scss" scoped>

</style>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
uni-app中,可以通过以下步骤对接口进行封装: 1. 创建一个`utils/request.js`文件,引入`uni.request`方法,并导出`baseURL`和`request`方法。 ``` export const baseURL = '基地址' export const request = (options) => { return new Promise((resolve, reject) => { uni.request({ url: baseURL + options.url, //接口地址:前缀+方法中传入的地址 method: options.method || 'GET', //请求方法:传入的方法或者默认是“GET” data: options.data || {}, //传递参数:传入的参数或者默认传递空集合 header: { 'token': uni.getStorageSync("token") || "" //自定义请求头信息 }, success: (res) => { console.log(res, uni.getStorageSync('token')); //返回的数据(不固定,看后端接口,这里是做了一个判断,如果不为true,用uni.showToast方法提示获取数据失败) if (res.data.code == 1) { resolve(res.data.data) } else { if (res.data.code == 401) { uni.navigateTo({ url:'/login/login' }) uni.clearStorageSync() } reject(res.data.msg) } // 如果不满足上述判断就输出数据 }, // 这里的接口请求,如果出现问题就输出接口请求失败 fail: (err) => { console.log(err) reject(err) } }) }) } ``` 2. 在需要使用接口的地方,引入`request`方法,并进行封装。 ``` // 在uniapp中调用接口的时候,如果需要在一进页面就请求数据就放到生命周期钩子里面 onLoad() { this.$rqt.loginIn().then(res=>{ console.log(res) }) } // 如果有参数的话,可以写在loginIn方法的参数里面 // 如果需要自己请求参数,可以写到方法里面 ``` 3. 创建一个`api/index.js`文件,引入`request`方法,并编写具体的接口请求方法。 ``` import { request } from '@/utils/request.js' // 获取论坛类型 /api/forum/ftype/index export const getForumType = (page, rows) => request({ url: 'forum/ftype/index', method: 'post', data: { page, rows } }) ``` 通过以上步骤,你可以在uni-app中对接口进行封装,方便统一管理和调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uniapp 接口封装](https://blog.csdn.net/m0_46846526/article/details/126362687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [uniapp封装接口](https://blog.csdn.net/zhuxiaolong1234/article/details/127816166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My&Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值