详解微信小程序的 request 封装示例


Posted in Javascript onAugust 21, 2018

背景

之前小程序代码混乱,所以新项目一开始就准备弄个微信小程序的 request 的封装

httpUtils.js

const request = function (path, method, data, header) {
 let user_id = "";
 let token = "";
 try {
  user_id = wx.getStorageSync(USER_ID_KEY);
  token = wx.getStorageSync(TOKEN_KEY);
 } catch (e) {}
 header = header || {};
 let cookie = [];
 cookie.push("USERID=" + user_id);
 cookie.push("TOKEN=" + token);
 cookie.push("device=" + 1);
 cookie.push("app_name=" + 1);
 cookie.push("app_version=" + ENV_VERSION);
 cookie.push("channel=" + 1);
 header.cookie = cookie.join("; ");
 return new Promise((resolve, reject) => {
  wx.request({//后台请求
   url: API_BASE_URL + path,
   header: header,
   method: method,
   data: data,
   success: function (res) {
    if (res.code) {
     reject(res.data)
    } else {
     resolve(res.data)
    }
   },
   fail: function (res) {
    reject("not data");
   }
  });
 });
};

userLogin.js

const login = function () {
 try {
  wx.removeStorageSync(USER_ID_KEY);
  wx.removeStorageSync(TOKEN_KEY)
 } catch (e) {}
 return new Promise((resolve, reject) => {
  wx.login({
   success: res => {
    let code = res.code;
    // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
    wx.getUserInfo({
     withCredentials: true,
     success: res => {
      let userInfo = res.userInfo;
      let name = userInfo.nickName;
      let avatar = userInfo.avatarUrl;
      let sex = userInfo.gender;
      let data = {
       code: code,
       encryptedData: res.encryptedData,
       iv: res.iv,
       name: name,
       avatar: avatar,
       sex: sex,
       from: FROM,
      };
      request("/api/user_login/byWeChatApplet", "POST", data).then( (res)=>{
       if (!res.code) {
        try {
         wx.setStorageSync(USER_ID_KEY, res.user_id);
         wx.setStorageSync(TOKEN_KEY, res.token)
        } catch (e) {
         reject(JSON.stringify(e));
        }
       }
       resolve(res)
      }).catch( (errMsg)=>{
       reject(errMsg)
      });
     },
     fail: function (res) {
      if (res.errMsg && res.errMsg.startsWith("getUserInfo:fail") && res.errMsg.search("unauthorized") !== -1) {
       reject("getUserInfo:fail");
       return;
      }
      wx.getSetting({
       success: (res) => {
        if (!res.authSetting["scope.userInfo"]) {//没授权
         showModal('提示', '需要获取用户的权限,点击确定前往设置,打开用户信息', true, function (res) {
          wx.openSetting({
           success: (res) => {
            // 用户返回 不管是否开启 接着去重新登录
            login().then( (res)=>{
             if (res.code) {
              reject(res.message);
              return
             }
             try {
              wx.setStorageSync(USER_ID_KEY, res.user_id);
              wx.setStorageSync(TOKEN_KEY, res.token)
             } catch (e) {
              reject(JSON.stringify(e));
             }
             resolve(res)
            }).catch( (errMsg)=>{
             reject(errMsg)
            });
           }
          })
         }, function () {})
        }
       }
      });
     }
    })
   }
  })
 });
};

项目地址:https://github.com/lmxdawn/wxa-demo

一个 vue + thinkphp5.1 搭建的后台管理:https://github.com/lmxdawn/vue-admin-html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript代码加载优化方法
Jan 30 Javascript
JSON.stringify 语法实例讲解
Mar 14 Javascript
jquery获取table中的某行全部td的内容方法
Mar 08 Javascript
Javascript 绘制 sin 曲线过程附图
Aug 21 Javascript
用javascript将数据导入Excel示例代码
Sep 10 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
AngularJS动态绑定HTML的方法分析
Nov 07 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
vue+moment实现倒计时效果
Aug 26 Javascript
Node.js web 应用如何封装到Docker容器中
Sep 01 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 #Javascript
vue监听对象及对象属性问题
Aug 20 #Javascript
微信小程序中使用自定义图标(阿里icon)的方法
Aug 20 #Javascript
Vue插件打包与发布的方法示例
Aug 20 #Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
Aug 20 #Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 #jQuery
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
Aug 20 #Javascript
You might like
PHP多个版本的分析解释
2011/07/21 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
基于JS实现PHP的sprintf函数实例
2015/11/14 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
Python中使用asyncio 封装文件读写
2016/09/11 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python dumps和loads区别详解
2020/02/04 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
init进程的作用
2012/04/12 面试题
遗嘱公证书标准样本
2014/04/08 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server