详解微信小程序的 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 幻灯片的实现
Dec 06 Javascript
javascript时区函数介绍
Sep 14 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
Feb 27 Javascript
js判断当前页面用什么浏览器打开的方法
Jan 06 Javascript
js实现内容显示并使用json传输数据
Mar 16 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
JS实现线性表的链式表示方法示例【经典数据结构】
Apr 11 Javascript
jQuery实现全选、反选和不选功能
Aug 16 jQuery
javascript流程控制语句集合
Sep 18 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 Javascript
vue 验证两次输入的密码是否一致的方法示例
Sep 29 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php实现的日历程序
2015/06/18 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
基于Python实现粒子滤波效果
2020/12/01 Python
Python jieba库分词模式实例用法
2021/01/13 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
介绍一下JMS编程步骤
2015/09/22 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
事业单位接收函
2014/01/10 职场文书
运动会100米解说词
2014/01/23 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
迎新晚会主持词开场白
2015/05/28 职场文书
宪法宣传标语100条
2019/10/15 职场文书