微信小程序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动态添加表格数据行(ASP后台数据库保存例子)
May 08 Javascript
return false;和e.preventDefault();的区别
Jul 11 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
JQuery性能优化的几点建议
May 14 Javascript
js面向对象之公有、私有、静态属性和方法详解
Apr 17 Javascript
angularJS Provider、factory、service详解及实例代码
Sep 21 Javascript
微信开发 消息推送实现代码
Oct 21 Javascript
Javascript数组中push方法用法分析
Oct 31 Javascript
js获取地址栏中传递的参数(两种方法)
Feb 08 Javascript
vue axios post发送复杂对象问题
Jun 04 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 Javascript
详解 javascript对象创建模式
Oct 30 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项目的方法
2006/10/09 PHP
php 无限级缓存的类的扩展
2009/03/16 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
用js编写留言板
2020/03/17 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
Python list操作用法总结
2015/11/10 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
快递员岗位职责
2014/09/12 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
JavaScript实现简单计时器
2021/06/22 Javascript
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers