微信小程序wx.request拦截器使用详解


Posted in Javascript onJuly 09, 2019

一.

请求后台的时候,服务端对每一个请求都会验证权限,而前端也需要对服务器返回的特殊状态码统一处理,所以可以针对业务封装请求。

首先我们通过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, '成功')
   }
  })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
Feb 27 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
Nov 20 Javascript
jquery提交form表单时禁止重复提交的方法
Feb 13 Javascript
JavaScript多并发问题如何处理
Oct 28 Javascript
浅谈Cookie的生命周期问题
Aug 02 Javascript
Bootstrap 模态框实例插件案例分析
Dec 28 Javascript
Bootstrap导航条学习使用(一)
Feb 08 Javascript
vue.js开发环境搭建教程
May 04 Javascript
webpack构建的详细流程探底
Jan 08 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
Dec 12 Javascript
基于javascript处理二进制图片流过程详解
Jun 08 Javascript
javascript实现图片轮播代码
Jul 09 #Javascript
关于微信小程序map组件z-index的层级问题分析
Jul 09 #Javascript
Webpack 4如何动态切割JS注入文件名详解
Jul 09 #Javascript
Vue 实现前端权限控制的示例代码
Jul 09 #Javascript
微信小程序文章详情页跳转案例详解
Jul 09 #Javascript
七行JSON代码把你的网站变成移动应用过程详解
Jul 09 #Javascript
js实现无缝滚动双图切换效果
Jul 09 #Javascript
You might like
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
JavaScript中的私有成员
2006/09/18 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
JS实现双击屏幕滚动效果代码
2015/10/28 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
webpack5 联邦模块介绍详解
2020/07/08 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python如何实现代码检查
2019/06/28 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
班主任工作经验材料
2014/02/02 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
小学生安全演讲稿
2014/04/25 职场文书
校园文明倡议书
2014/05/16 职场文书
校园演讲稿汇总
2014/05/21 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
如何通过cmd 连接阿里云服务器
2022/04/18 Servers