微信小程序wx.request拦截 器使用详解
作者:这麻雀 发布时间:2023-07-22 09:11:55
标签:微信,小程序,wx.request, ,
一.
请求后台的时候,服务端对每一个请求都会验证权限,而前端也需要对服务器返回的特殊状态码统一处理,所以可以针对业务封装请求。
首先我们通过request * 在每个请求头里面塞入token等信息,好让后端对请求进行权限验证。并创建一个respone * ,当服务端返回特殊的状态码,我们统一做处理,如未登录网络错误等操作。
二.
1.首先了解小程序官方api-wx.request() ,通过示例可以看出wx.request的参数是一个对象,拥有传输地址,传输内容,响应头,成功失败回调函数等属性和方法,我们可以通过封装相应的响应头和成功失败回调函数达到相应的目的:
// 官方代码示例
wx.request({
url: 'test.php', //仅为示例,并非真实的接口地址
data: {
x: '',
y: ''
},
header: {
'content-type': 'application/json' // 默认值
},
success (res) {
console.log(res.data)
}
fail(res){
console.log(res)
}
})
2.封装
封装请求头和返回的状态码(注:具体头需要添加哪些属性,返回的状态码处理,是根据与后台实际沟通所需的参数来制定的)
const app = getApp();
const appid = 'xxxx';
const appSecret = 'xxxxxx';
let ajaxNum = 0;
// 获取accessToken
function getAccessToken(callback) {
wx.request({
url: '/api/Token',
data: {
appid: aesEncrypt(appid),// aesEncrypt():自定义的用crypto-js.js进行aes加密的方法,这里只需要知道加密了即可,不需要关注此方法
appSecret: aesEncrypt(appSecret),
},
success: function (res) {
if(res.statusCode ===200 && res.data.code === 0) {
let accesstoken = res.data.data.accesstoken;
if (typeof (callback) === 'function' && accesstoken) {
callback(accesstoken);
}
}
},
})
}
// 封装request请求
const myRequest = options => {
if(options) {
getAccessToken(function (accesstoken){
// header 设置Content-Type,accesstoken, usertoken, noncestr, timestamp等信息,与后台协商好
if(options.header === undefined || options.header === null) {
options.header = {};
}
options.header['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
// usertoken在登录后保存在缓存中,所以从缓存中取出,放在header
let usertoken = wx.getStorageSync('usertoken');
if (usertoken) {
options.header['usertoken'] = usertoken;
}
// 自定义getNoncestr()设置随机字符串,getTimestamp()获取时间戳
let noncestr = getNoncestr();
let timestamp = getTimestamp();
// sign进行加密
let sign = getSign(accesstoken, appid, appSecret, noncestr, timestamp);
if (timestamp) {
options.header['timestamp'] = timestamp;
}
if (noncestr) {
options.header['noncestr'] = noncestr;
}
if (sign) {
options.header['sign'] = sign;
}
//url
let baseUrl = config.BASE_HOST;
if (options.url.indexOf('http') != 0) {
options.url = baseUrl + options.url;
}
// method、data
if (options.method === undefined || options.method === null) {
options.method = 'post';
}
if (options.method.toLowerCase() === 'post') {
if(options.data) {
let dataStr = JSON.stringify(options.data);
let base64Str = base64Encrypt(dataStr);
options.data = serializeData({ param: base64Str });
}
}
//success
if (options.success && typeof(options.success) === 'function') {
let successCallback = options.success;
options.success = function(res) {
// 判断不同的返回码 200/404
if (res.statusCode === 200) {
try {
// 接收的后台数据用自定义base64解密方法解密后转为对象
let str = base64Decrypt(res.data);
let data = JSON.parse(str);
if (parseInt(data.resultCode, 10) === -1) {//后台商议好的状态码,-2未登录,-1-3后台出错
console.error('网络超时,请稍后重试');
} else if (parseInt(data.resultCode, 10) === -3) {
console.error(data.msg);
} else if (parseInt(data.resultCode, 10) === -2){
console.log("用户未登录-ajax");
}
res.data = data;
//调用自定义的success
successCallback(res);
} catch (e) {
console.error('出错了,' + e + ',接口返回数据:' + res.data);
}
} else if(res.statusCode === 404) {
console.log('404');
}
}
}
//执行微信的请求
wx.request(options);
});
}
}
module.exports = {
myRequest: myRequest
页面调用示范(与wx.request传参一致):
const ajax = require('ajax.js');
ajax.javaRequest({
url: '/xxx',
data: {
xxxx: xxx
},
method: 'POST',
success: res => {
console.log(res, '成功')
}
})
来源:https://www.jianshu.com/p/80b40e213f17


猜你喜欢
- 在进行数据分析、数据建模时,我们首先要做的就是对数据进行处理,提取我们需要的信息。下面为大家介绍一些groupby的用法,以便能够更加方便地
- 常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错。所以最好在做任何操作之前,先判断文件是否存在。这里将介绍三种
- JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。而cookie是运行在
- Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4
- 环境介绍python3.5.2 64位django 1.10.3apache 2.4 64位windows 10重点在apache上。pyt
- K-means算法介绍简单来说,K-means算法是一种无监督算法,不需要事先对数据集打上标签,即ground-truth,也可以对数据集进
- 本文实例为大家分享了Python读写Excel表格的具体代码,供大家参考,具体内容如下python读取Excel表格:import xlrd
- 概述Go 的并发模型与其他语言不同,虽说它简化了并发程序的开发难度,但如果不了解使用方法,常常会遇到 goroutine 泄露的问题。虽然
- python加密打包程序加密方式:将py文件转为pyd格式安装easycython模块 pip install easycython使用ea
- 1.世界地图绘制演示先给大家看下效果图哈。① 世界地图数据准备地图数据如下:因为是世界地图,所以对标的国家,我设置了 2 组,里面的数据是随
- 这里给大家分享一段使用PHP Socket 编程模拟Http post和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http
- 摘要: 利用binlog闪回误操作数据。基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚
- 问题你想使用一个简单的REST接口通过网络远程控制或访问你的应用程序,但是你又不想自己去安装一个完整的web框架。解决方案构建一个REST风
- 本文主要是用PyTorch来实现一个简单的回归任务。 编辑器:spyder1.引入相应的包及生成伪数据import torchimport
- 每天不同时间段通过微信发消息提醒女友简介有时候,你很想关心她,但是你太忙了,以至于她一直抱怨,觉得你不够关心她。你暗自下决心,下次一定要准时
- 内容摘要:有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接mysql、修改密码、增加用户等方面来学习一些mysq
- 读写 JSON 数据问题你想读写 JSON(JavaScript Object Notation) 编码格式的数据。解决方案json模块提供
- 这个仿msn的右下角popup提示窗口效果很久以前收集的,现在整理出来给大家分享,需要的朋友可以拿去用,特点,提示窗口内容和js代码分离容易
- scriptlet的使用jsp页面中分三种scriptlet:第一种:<% %> 可以在里面写java的代码。定义java变量以
- 每位SQL Server开发员都有自己的首选操作方法。我的方法叫做分子查询。这些是由原子查询组合起来的查询,通过它们我可以处理一个表格。将原