微信小程序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读取RSS数据
Jan 20 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
Dec 05 Javascript
构造函数+原型模式构造js自定义对象(最通用)
May 12 Javascript
javascript实现验证IP地址等相关信息代码
May 10 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
动态更新highcharts数据的实现方法
May 28 Javascript
微信小程序开发图片拖拽实例详解
May 05 Javascript
谈谈JS中的!!
Dec 07 Javascript
深入解析ES6中的promise
Nov 08 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
Nov 30 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
Apr 26 Javascript
JavaScript中的各种宽高属性的实现
May 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引用(&)各种使用方法实例详解
2014/03/20 PHP
php使用Imagick生成图片的方法
2015/07/31 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
js文件中调用js的实现方法小结
2009/10/23 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
生成二维码方法汇总
2014/12/26 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
Python实现快速计算词频功能示例
2018/06/25 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
Python读取VOC中的xml目标框实例
2020/03/10 Python
Python实现AI换脸功能
2020/04/10 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
文明学生标兵事迹
2014/01/21 职场文书
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
校园安全教育广播稿
2014/02/17 职场文书
师范生自我鉴定
2014/03/20 职场文书
股权转让协议范本
2014/12/07 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js
MySQL中order by的执行过程
2022/06/05 MySQL