微信小程序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 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
JavaScript 脚本将当地时间转换成其它时区
Mar 19 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
Feb 23 Javascript
JS中判断JSON数据是否存在某字段的方法
Mar 07 Javascript
AngularJS基础教程之简单介绍
Sep 27 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
javascript 动态样式添加的简单实现
Oct 11 Javascript
基本DOM节点操作
Jan 17 Javascript
layui.js实现的表单验证功能示例
Nov 15 Javascript
javaScript实现游戏倒计时功能
Nov 17 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 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比较相似字符串的方法
2015/06/05 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
技术总监岗位职责
2013/12/05 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
中央空调节能方案
2014/06/15 职场文书
抗震救灾标语
2014/06/26 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
初婚未育证明样本
2015/06/18 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python