详解微信小程序的 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表格插件ParamQuery简单使用方法示例
Dec 05 Javascript
jQuery中remove()方法用法实例
Dec 25 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
Mar 04 Javascript
javascript先序遍历DOM树的方法
Feb 27 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
AngularJs  Creating Services详解及示例代码
Sep 02 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
React创建组件的三种方式及其区别
Jan 12 Javascript
在vue中把含有html标签转为html渲染页面的实例
Oct 28 Javascript
TypeScript 内置高级类型编程示例
Sep 23 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
Python查找文件中包含中文的行方法
2018/12/19 Python
python 字符串常用方法汇总详解
2019/09/16 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
解决django FileFIELD的编码问题
2020/03/30 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
目标责任书格式
2014/07/28 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
基层党组织整改方案
2014/10/25 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
担保贷款承诺书
2015/04/30 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL