详解微信小程序的 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 相关文章推荐
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
使用POST方式弹出窗口的两种方法示例介绍
Jan 29 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
Django+Vue.js搭建前后端分离项目的示例
Aug 07 Javascript
bootstrap 通过加减按钮实现输入框组功能
Nov 15 Javascript
Express进阶之log4js实用入门指南
Feb 10 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
Mar 06 Javascript
jQuery实现表格隔行换色
Sep 01 jQuery
vue 动态组件用法示例小结
Mar 06 Javascript
js 实现碰撞检测的示例
Oct 28 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/02 无线电
PHP初学者头疼问题总结
2006/07/08 PHP
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
Speedo美国:澳大利亚顶尖泳衣制造商
2016/08/03 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
几个Shell Script面试题
2014/04/18 面试题
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
合同专员岗位职责
2013/12/18 职场文书
市场营销专业求职信
2014/06/17 职场文书
公务员年终个人总结
2015/02/12 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang
Python如何让字典保持有序排列
2022/04/29 Python
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis