详解微信小程序的 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 oop开发滑动(slide)菜单控件
Aug 25 Javascript
JavaScript中操作Mysql数据库实例
Apr 02 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
Jul 28 Javascript
每天一篇javascript学习小结(面向对象编程)
Nov 20 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
浅析vue.js数组的变异方法
Jun 30 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
详解利用eventemitter2实现Vue组件通信
Nov 04 Javascript
JS 图片压缩原理与实现方法详解
Apr 29 Javascript
JS array数组检测方式解析
May 19 Javascript
JavaScript逻辑运算符相关总结
Sep 04 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 的 __FILE__ 常量
2007/01/15 PHP
php限制ip地址范围的方法
2015/03/31 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
JavaScript While 循环基础教程
2007/04/05 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python使用functools实现注解同步方法
2018/02/06 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
python实现学生成绩测评系统
2020/06/22 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
小学科学教学反思
2014/01/26 职场文书
党员公开承诺书范文
2014/03/25 职场文书
读书月活动方案
2014/05/22 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
家庭困难证明
2014/10/12 职场文书
财务部岗位职责
2015/02/03 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
小学运动会前导词
2015/07/20 职场文书
追悼会答谢词范文
2015/09/29 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers