详解微信小程序的 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 相关文章推荐
JQuery从头学起第二讲
Jul 04 Javascript
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
JQuery Tips相关(1)----关于$.Ready()
Aug 14 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
简述JS浏览器的三种弹窗
Jul 15 Javascript
eslint+prettier统一代码风格的实现方法
Jul 22 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
PHP安全配置详细说明
2011/09/26 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
asp 取文本框名称代码
2008/12/02 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
vuex存值与取值的实例
2019/11/06 Javascript
python正则中最短匹配实现代码
2018/01/16 Python
带你认识Django
2019/01/15 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Django web框架使用url path name详解
2019/04/29 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Django-migrate报错问题解决方案
2020/04/21 Python
美国性感内衣店:Yandy
2018/06/12 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
会计毕业生求职简历的自我评价
2013/10/20 职场文书
人力资源行政经理自我评价
2013/10/23 职场文书
市场营销专业个人求职信范文
2013/12/14 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
网络管理员岗位职责
2015/02/12 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
学习心得体会
2019/06/20 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技