微信小程序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 对象的解释
Nov 24 Javascript
JavaScript 学习笔记之语句
Jan 14 Javascript
再JavaScript的jQuery库中编写动画效果的指南
Aug 13 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
Aug 25 Javascript
jQuery焦点图插件SaySlide
Dec 21 Javascript
jQuery CSS3相结合实现时钟插件
Jan 08 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
jQuery中库的引用方法
Jan 06 jQuery
使用proxy实现一个更优雅的vue【推荐】
Jun 19 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
Nov 30 Javascript
详解json串反转义(消除反斜杠)
Aug 12 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 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实现通过get方式识别用户发送邮件的方法
2015/07/16 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php中使用GD库做验证码
2016/03/31 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
分享Python文本生成二维码实例
2016/01/06 Python
python Django批量导入不重复数据
2016/03/25 Python
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
Django中的cookie和session
2019/08/27 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
单位推荐信范文
2015/03/27 职场文书
中国合伙人观后感
2015/06/02 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
HTML中的表单元素介绍
2022/02/28 HTML / CSS