微信小程序封装请求接口

本文介绍了如何在使用Vue开发习惯下,将微信小程序的wx.request封装成async/await风格,并实现每次请求自动添加token,简化编程。通过实例展示了封装后的请求模块、配置文件和用户功能管理,便于在App.js中全局调用和用户登录登出操作。
摘要由CSDN通过智能技术生成

目的

因为之前一直在使用vue开发,相较于微信小程序的wx.request里面的回调,还是感觉async和await使用起来比较方便,是以想继续使用此方法进行操作。同时,因为每次后端接口请求都要携带上token,为了方便操作,将其进行封装,使之每次请求自动加上token,简便编程

实现过程

  1. api.js
    主要参考:
    微信小程序的异步请求/ promise封装 / async&await改造

    Await 修饰的对象一定要返回一个 promise 对象
    而wx.request并不符合这一规定。

    a.首先了解wx.request

    // 原生发送异步请求
    wx.request({
    	url: '', // 请求的路径
    	method: "", // 请求的方式
    	data: {}, // 请求的数据
    	header: {}, // 请求头
    	success: (res) => {
          	// res  响应的数据
    	}
    })
    

    b.用 promise 封装 wx.request

    app.js:

    ------------------- 第一, 在utils下新建一个js文件,进行封装 -----------------------	
    // promise 特点:一创建就立即执行,一般情况下解决这个问题我们会将其封装为一个函数
    // options:请求时的参数对象
    function myrequest(options) {
      return new Promise((resolve, reject) => {
        // 逻辑:发送请求到服务器
        wx.request({
          url: options.url,
          method: options.method || "GET",
          data: options.data || {},
          header: options.header || {},
          success: res => {
            resolve(res);
          },
          fail: err => {
            reject(err);
          }
        });
      });
    }
    // 暴露给外界
    export default myrequest;
    
  2. config.js

    用于配置基本信息

    export default {
      // api请求前缀
      // 这里填后端请求的固定前缀
      webUrl:'************',
    }
    
  3. request.js

    所有请求的封装

    import config from  "./config.js";
    import User from "./user.js";
    import myrequest from "./api.js";
    export default {
      config: {
        baseUrl:config.webUrl,
        header: {
          'Content-Type':'application/json;charset=UTF-8',
    			// 'Content-Type':'application/x-www-form-urlencoded'
        },
        data: {},
    		method: "GET",
    		dataType: "json",
      },
      request(options = {}) {
        options.header = options.header || this.config.header;
        options.method = options.method || this.config.method;
    	options.dataType = options.dataType || this.config.dataType;
        options.url = this.config.baseUrl+options.url;
    
        console.log(options);
        
        // 暂定
        if(options.token) {
          if(!this.checkToken(options.checkToken)) return;
    
          options.header.Authorization = User.token;
        }
        return myrequest(options);
      },
      get(url,data,options={}) {
        options.url = url;
        options.data = data;
        options.method = 'GET';
        return this.request(options);
      },
      post(url,data,options={}){
    	options.url = url;
    	options.data = data;
        options.method = 'POST';
        console.log(options)
    	return this.request(options);
      },
      // 验证用户是否登录
      checkToken(checkToken){
    	if (checkToken && !User.token) {
    		// 未登录
    		wx.showToast({
            	title: '请先登录',
          	});
    		wx.navigateTo({
        		url: '/pages/index/index',
      		});
    		return false;
    	}
    	return true;
     },
    }
    
  4. user.js

    封装用户基本功能的请求

    import $http from "./request.js";
    export default {
    	// 用户token 测试token:4cd36bf70649475ac0cd6fae78250954474a4350
    	token: false,
    	// 用户信息
    	userinfo: false,
    	// 初始化
    	__init() {
    		// 获取用户信息
    		this.userinfo = wx.getStorageSync("userinfo");
    		this.token = wx.getStorageSync("token");
    	},
    	// 权限验证跳转
    	// 类似路由守卫
    	navigate(options, NoCheck = false, type = "navigateTo") {
    		// 是否登录验证
    		// $http使用了request.js的方法
    		if (!$http.checkToken(true)) return;
    		// 跳转
    		switch (type) {
    			case "navigateTo":
    				wx.navigateTo(options);
    				break;
    			case "redirectTo":
    				wx.redirectTo(options);
    				break;
    			case "reLaunch":
    				wx.reLaunch(options);
    				break;
    			case "switchTab":
    				wx.switchTab(options);
    				break;
    		}
    	},
    	// 登录
    	async login(options = {}) {
    		wx.showLoading({
    			title: '登录中...',
    			mask: true
        	});
    		// 请求登录
    		const {data:res} = await $http.post(options.url,options.data)
    	    console.log(res);
    		// 登录失败
    		if(res.code != 200){
    			wx.hideLoading();
    			wx.showToast({
    				title: "用户或密码错误",
    				icon: "none"
    			})
    			return false;
    		}
    		// 登录成功 保存状态
    		// Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJxdWxpdGFvIiwiY3JlYXRlZCI6MTU4NjY4NTQxNzk3NywiZXhwIjoxNTg3MjkwMjE3fQ.1B0umjdawHeqFfAQeNNQLAKEbkXjH0jr8o9PjCw2sfAwWdQlLSOQRCPX2w79mFD8_aFajZBkekS3Io9WSMPDTA
    		console.log(res); // res.data就是返回的全部信息
    		this.token = res.data.token;
    		this.userinfo = res.data;
    		console.log("token: ", this.token);
    		console.log("userinfo: ", this.userinfo);
    		// 本地存储
    		wx.setStorageSync("userinfo", this.userinfo);
    		wx.setStorageSync("token", this.token);
    		// 成功提示
    		wx.hideLoading();
    		wx.showToast({
    			title: '登录成功'
    		});
    		console.log(options);
    		return true;
    	},
    	// 退出登录
    	async logout(showToast = true) {
    		// 退出登录
    		// await $http.post('/user/logout',{},{ 
    		// 	token:true,
    		// 	checkToken:true ,
    		// });
    		// 清除缓存
    		wx.removeStorageSync('userinfo');
    		wx.removeStorageSync('token');
    		// 清除状态
    		this.token = false;
    		this.userinfo = false;
    		// 返回home页面
    		wx.switchTab({
    			url: "/pages/index/index",
    			success() {
    				let page = getCurrentPages().pop(); //跳转页面成功之后
    				if (!page) return;
    				page.onLoad(); //如果页面存在,则重新刷新页面
    			}
    		})
    
    		// 退出成功
    		if (showToast) {
    			return wx.showToast({
    				title: '退出登录成功'
    			});
    		}
    	},
    	// 获取用户相关统计信息
    	async getUserInfo() {
    		// 统计获取用户相关数据(总文章数,今日文章数,评论数 ,关注数,粉丝数,文章总点赞数)
    		// let [err, res] = await $http.post('/user/getCurrentUser', {}, {
    		// 	token: true,
    		// 	checkToken: true
    		// })
    		// 请求错误处理
    		// if (!$http.errorCheck(err, res)) return;
    		// 成功
    		// this.userinfo = res.data.data;
    		// console.log(this.userinfo);
    	}
    }
    

ps: 这些js文件放置目录如下:
在这里插入图片描述

自定义封装user方法

  1. 登录封装:不需要携带token
async login(options = {}) {
	// 请求登录
	const {data:res} = await $http.post(options.url,options.data)
	/* 
	这样写也可
	const {data:res} = await $http.post(‘/auth/login’,{
		code: '11111'
	})
	*/
	
    console.log(res);
},
  1. 用户的其他请求封装:需要使用token

首先看张截图,明白post的传参都代表什么

在这里插入图片描述
在options中多加这两个属性

{
	token: true,
	checkToken: true
}

请求如下:

async updateUserInfo(options = {}) {
	// 更新数据
	// 只有添加token才能访问的请求需要在后面添加这两个属性,这个属性是直接加载到options上的
	const { data: res } = await $http.post(options.url, options.data, {
		token: true,
		checkToken: true
	})
	console.log(res);
	// 失败
	if (res.code != 200) {
		wx.showToast({
			title: "获取信息失败",
			icon: "none"
		})
		return false;
	}
	// console.log(res)
}

重点

在这里插入图片描述
在request.js的最底层请求封装在,这个header的Authorization的token一定要加上“Bearer ”
没有个空格,否则一直行不通

使用方法

  1. 在app.js中引入,并挂载为全局方法

    import request from './utils/common/request.js'
    import user from './utils/common/user.js'
    
    App({
      onLaunch: function () {
        // 挂载全局方法
        wx.$http = request
        wx.User = user
    })
    
  2. 在guide.js中使用

    const app = getApp()
    
    
    wx.User.login({
      url: "/auth/login",
      data: {
        code: res.code
      }
    })
           
    

    选择好wx.User或者wx.$http
    选择各自有的方法,传相应参数即可

    ps: $http中有post和get等基本方法

    类似上面使用即可

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weixin_42955958

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

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

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

打赏作者

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

抵扣说明:

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

余额充值