详解微信小程序的 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,超强推荐base.js
Dec 23 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
Jun 25 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
HTML的select控件美化
Mar 27 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
Sep 20 jQuery
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
如何给element添加一个抽屉组件的方法步骤
Jul 14 Javascript
Vue使用NProgress进度条的方法
Sep 21 Javascript
webpack常用配置总览(小结)
Nov 18 Javascript
原生JS运动实现轮播图
Jan 02 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+MSSQL分页的例子
2006/10/09 PHP
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
php查询内存信息操作示例
2019/05/09 PHP
PHP实现简单的计算器
2020/08/28 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
Python中的异常处理简明介绍
2015/04/13 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
纯CSS3实现8组超炫酷鼠标滑过图片动画
2016/03/16 HTML / CSS
德国团购网站:Groupon德国
2018/03/13 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
电气自动化大学生求职信
2013/10/16 职场文书
小学少先队活动方案
2014/02/18 职场文书
公司股东出资证明书
2014/11/01 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
中秋联欢会主持词
2015/07/04 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
OpenCV-Python实现轮廓拟合
2021/06/08 Python
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS