详解微信小程序网络请求接口封装实例


Posted in Javascript onMay 02, 2019

网络请求封装实例

实现定制要求和方便调用,对微信小程序的网络请求接口进行了封装

  1. 封装位置:app.js,方便全局调用
  2. 实现方法调用,只用关注接口url和入参
  3. 默认和自定义的请求成功、失败和完成的回调处理
  4. 可设置请求失败自动重新请求的次数
  5. 可以防止重复提交
  6. 每个请求设定requestCode

代码

直接将这个方法放在了app.js中

/**
  * 接口公共访问方法
  * @param {Object} urlPath 访问路径
  * @param {Object} params 访问参数(json格式)
  * @param {Object} requestCode 访问码,返回处理使用
  * @param {Object} onSuccess 成功回调
  * @param {Object} onErrorBefore 失败回调
  * @param {Object} onComplete 请求完成(不管成功或失败)回调
  * @param {Object} isVerify 是否验证重复提交
  * @param {Object} requestType 请求类型(默认POST)
  * @param {Object} retry 访问失败重新请求次数(默认1次)
  */
 webCall: function (urlPath, params, requestCode, onSuccess, onErrorBefore, onComplete, isVerify, requestType, retry) {
  var params = arguments[1] ? arguments[1] : {};
  //var requestCode = arguments[2] ? arguments[2] : 1;
  var onSuccess = arguments[3] ? arguments[3] : function () { };
  var onErrorBefore = arguments[4] ? arguments[4] : this.onError;
  var onComplete = arguments[5] ? arguments[5] : this.onComplete;
  var isVerify = arguments[6] ? arguments[6] : false;
  var requestType = arguments[7] ? arguments[7] : "POST";
  var retry = arguments[8] ? arguments[8] : 1;
  var that = this;

  //防止重复提交,相同请求间隔时间不能小于500毫秒
  var nowTime = new Date().getTime();
  if (this.requestCount[urlPath] && (nowTime - this.requestCount[urlPath]) < 500) {
   return;
  }
  this.requestCount[urlPath] = nowTime;
  //是否验证重复提交
  if (isVerify) {
   if (this.verifyCount[urlPath]) {
    return;
   }
   this.verifyCount[urlPath] = true; //重复验证开关开启
  }

  console.log("发起网络请求, 路径:" + (that.apiHost + urlPath) + ", 参数:" + JSON.stringify(params));
  wx.request({
   url: that.apiHost + urlPath,
   data: params,
   method: requestType, // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
   header: {
    'content-type': requestType == 'POST' ?
     'application/x-www-form-urlencoded' : 'application/json'
   }, // 设置请求的 header
   success: function (res) {
    console.log("返回结果:" + JSON.stringify(res.data));
    if (res.data) {
     if (res.data.statusCode == 200) { //访问成功
      onSuccess(res.data, requestCode);
     } else if (res.data.statusCode == 300000001) { // 未登录
      that.isLogin = false;
      onErrorBefore(0, res.data.message, requestCode);
     } else {
      onErrorBefore(0, res.data.message == null ? "请求失败 , 请重试" : res.data.message, requestCode);
     }
    } else {
     onErrorBefore(0, "请求失败 , 请重试", requestCode);
    }
   },
   fail: function (res) {
    retry--;
    console.log("网络访问失败:" + JSON.stringify(res));
    if (retry > 0) return that.webCall(urlPath, params, requestCode, onSuccess, onErrorBefore, onComplete, requestType, retry);
   },
   complete: function (res) {
    onComplete(requestCode);
    //请求完成后,2秒后重复验证的开关关闭
    if (isVerify) {
     setTimeout(function () {
      that.verifyCount[urlPath] = false;
     }, 2000);
    }
   }
  })
 }

上面的verifyCount是放在data中的数组,apiHost 是放在js最外层的接口服务器地址,方便随时开发、测试环境。

这个方法也是必不可少的

complete: function (res) {
    onComplete(requestCode);
    //请求完成后,2秒后重复验证的开关关闭
    if (isVerify) {
     setTimeout(function () {
      that.verifyCount[urlPath] = false;
     }, 2000);
    }
   }
  })

调用示范

请求:

// 请求 home banner 数据
  wx.showNavigationBarLoading();
  app.webCall("/app/homeBanner", {}, QUERY_BANNER, this.onSuccess, this.onErrorBefore, this.onComplete);

请求成功的回调处理:

/**
  * 接口访问成功返回
  * @param {Object} data
  * @param {Object} requestCode
  */
 onSuccess: function (data, requestCode) {
   var that = this;
  switch (requestCode) {
   case QUERY_BANNER:
    that.setData({ bannerData: (data ? data.data : []) });
    break;
  }

QUERY_BANNER是放在js最外层的常量,用于接口访问完成后的回调方法来区分请求的接口是哪个。

请求完成的处理:

/**
  * 接口访问完成
  * @param {Object} resultCode
  */
 onComplete: function (resultCode) {
  console.log("home onComplete1");

  if (--mCurrentRequestNums <= 0) {
   wx.hideNavigationBarLoading();
  }
 }

mCurrentRequestNums 是放在js最外层的变量,表示发起请求的数量,用于多个接口同时被调用,并希望在全部请求结束后关闭标题栏加载动画时用。

以上所述是小编给大家介绍的微信小程序网络请求接口封装详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
解决 FireFox 下[使用event很麻烦] 的问题.
Aug 22 Javascript
JS模拟的QQ面板上的多级可展开的菜单
Oct 10 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
Mar 14 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
jQuery中element选择器用法实例
Dec 29 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
Aug 25 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
Sep 04 Javascript
jQuery网页右侧广告跟随滚动代码分享
Apr 20 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
Oct 23 Javascript
bootstrap中selectpicker下拉框使用方法实例
Mar 22 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
js根据后缀判断文件文件类型的代码
May 09 Javascript
vue 搭建后台系统模块化开发详解
May 01 #Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 #Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 #Javascript
3分钟了解vue数据劫持的原理实现
May 01 #Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
May 01 #Javascript
JavaScript强制类型转换和隐式类型转换操作示例
May 01 #Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
May 01 #Javascript
You might like
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
尝试在让script的type属性等于text/html
2013/01/15 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
2016/01/22 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
解决Python安装cryptography报错问题
2020/09/03 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
易程科技软件测试笔试
2013/03/24 面试题
初中同学会活动方案
2014/08/22 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2015年端午节活动方案
2015/05/05 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
纪律委员竞选稿
2015/11/19 职场文书
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers