微信小程序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 相关文章推荐
jQuery学习笔记之DOM对象和jQuery对象
Dec 22 Javascript
JS动态添加与删除select中的Option对象(示例代码)
Dec 25 Javascript
js格式化时间小结
Nov 03 Javascript
node.js中的http.response.writeHead方法使用说明
Dec 14 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
Jun 25 Javascript
AngularJS入门之动画
Jul 27 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
Jun 16 jQuery
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
Aug 29 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 程序授权验证开发思路
2009/07/09 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
python抓取网页内容示例分享
2014/02/24 Python
Python制作数据导入导出工具
2015/07/31 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python三大神器之fabric使用教程
2019/06/10 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
python自动生成sql语句的脚本
2021/02/24 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
广告学毕业生求职信
2014/01/30 职场文书
酒店员工职业生涯规划
2014/02/25 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
综合管理员岗位职责
2015/02/11 职场文书
mysql sock 文件解析及作用讲解
2022/07/15 MySQL