微信小程序网络请求封装示例


Posted in Javascript onJuly 24, 2018

网络请求

网络请求小程序提供了wx.request, 仔细看一下 api,这不就是n年前的 $.ajax 吗,好古老啊。

// 官方例子
wx.request({
 url: 'test.php', //仅为示例,并非真实的接口地址
 data: {
   x: '' ,
   y: ''
 },
 header: {
   'content-type': 'application/json' // 默认值
 },
 success: function(res) {
  console.log(res.data)
 }
})

小程序支持ES6,那么就应该支持Promise 了,很开心~, 话不多说直接上代码吧

Promise封装

const baseUrl = 'https://api.it120.cc';

const http = ({ url = '', param = {}, ...other } = {}) => {
  wx.showLoading({
    title: '请求中,请耐心等待..'
  });
  let timeStart = Date.now();
  return new Promise((resolve, reject) => {
    wx.request({
      url: getUrl(url),
      data: param,
      header: {
        'content-type': 'application/json' // 默认值 ,另一种是 "content-type": "application/x-www-form-urlencoded"
      },
      ...other,
      complete: (res) => {
        wx.hideLoading();
        console.log(`耗时${Date.now() - timeStart}`);
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data)
        } else {
          reject(res)
        }
      }
    })
  })
}

const getUrl = (url) => {
  if (url.indexOf('://') == -1) {
    url = baseUrl + url;
  }
  return url
}

// get方法
const _get = (url, param = {}) => {
  return http({
    url,
    param
  })
}

const _post = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'post'
  })
}

const _put = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'put'
  })
}

const _delete = (url, param = {}) => {
  return http({
    url,
    param,
    method: 'put'
  })
}
module.exports = {
  baseUrl,
  _get,
  _post,
  _put,
  _delete
}

使用

const api = require('../../utils/api.js')

// 单个请求
api.get('list').then(res => {
 console.log(res)
}).catch(e => {
 console.log(e)
})

// 一个页面多个请求
Promise.all([
 api.get('list'),
 api.get(`detail/${id}`)
]).then(result => {
 console.log(result)
}).catch(e => {
 console.log(e)
})

登陆问题

做一个应用,肯定避免不了登录操作。用户的个人信息啊,相关的收藏列表等功能都需要用户登录之后才能操作。一般我们使用token做标识。

小程序并没有登录界面,使用的是 wx.login wx.login 会获取到一个 code,拿着该 code 去请求我们的后台会最后返回一个token到小程序这边,保存这个值为 token 每次请求的时候带上这个值。
一般还需要把用户的信息带上比如用户微信昵称,微信头像等,这时候就需要使用 wx.getUserInfo ,这里涉及到一个用户授权的问题

带上用户信息就够了嘛? too young too simple!我们的项目不可能只有小程序,相应的微信公众平台可能还有相应的App,我们需要把账号系统打通,让用户在我们的项目中的账户是同一个。这就需要用到微信开放平台提供的 UnionID 。

登陆

//app.js
App({
 onLaunch: function () {
  console.log('App onLaunch');
  var that = this;
  // 获取商城名称
  wx.request({
   url: 'https://api.it120.cc/'+ that.globalData.subDomain +'/config/get-value',
   data: {
    key: 'mallName'
   },
   success: function(res) {
    wx.setStorageSync('mallName', res.data.data.value);
   }
  })
  this.login();
  this.getUserInfo();
 },
 login : function () {
  var that = this;
  var token = that.globalData.token;
  // 如果有token
  if (token) {
   // 检查token是否有效
   wx.request({
    url: 'https://api.it120.cc/' + that.globalData.subDomain + '/user/check-token',
    data: {
     token: token
    },
    success: function (res) {
     // 如果token失效了
     if (res.data.code != 0) {
      that.globalData.token = null;
      that.login(); // 重新登陆
     }
    }
   })
   return;
  }

  // 【1】调用微信自带登陆
  wx.login({
   success: function (res) {
    // 【2】 拿到code去访问我们的后台换取其他信息
    wx.request({
     url: 'https://api.it120.cc/'+ that.globalData.subDomain +'/user/wxapp/login',
     data: {
      code: res.code
     },
     success: function(res) {
      // 如果说这个code失效的
      if (res.data.code == 10000) {
       // 去注册
       that.registerUser();
       return;
      }
      // 如果返回失败了
      if (res.data.code != 0) {
       // 登录错误 
       wx.hideLoading();
       // 提示无法登陆
       wx.showModal({
        title: '提示',
        content: '无法登录,请重试',
        showCancel:false
       })
       return;
      }
      
      // 【3】 如果成功后设置token到本地
      that.globalData.token = res.data.data.token;
      // 保存用户信息
      wx.setStorage({
       key: 'token',
       data: res.data.data.token
      })
     }
    })
   }
  })
 },
 // 注册?? [这个看需求]
 registerUser: function () {
  var that = this;
  wx.login({
   success: function (res) {
    var code = res.code; // 微信登录接口返回的 code 参数,下面注册接口需要用到
    wx.getUserInfo({
     success: function (res) {
      var iv = res.iv;
      var encryptedData = res.encryptedData;
      // 下面开始调用注册接口
      wx.request({
       url: 'https://api.it120.cc/' + that.globalData.subDomain +'/user/wxapp/register/complex',
       data: {code:code,encryptedData:encryptedData,iv:iv}, // 设置请求的 参数
       success: (res) =>{
        wx.hideLoading();
        that.login();
       }
      })
     }
    })
   }
  })
 },
 // 获取用户信息
 getUserInfo:function() {
  wx.getUserInfo({
   success:(data) =>{
    this.globalData.userInfo = data.userInfo;
    wx.setStorage({
     key: 'userInfo',
     data: data.userInfo
    })
    return this.globalData.userInfo;
   }
  })
 },
 globalData:{
  userInfo:null,
  subDomain:"34vu54u7vuiuvc546d",
  token: null
 }
})

授权问题

微信小程序网络请求封装示例

getUserInfo: function () {
  // 先调用wx.getSetting 获取用户权限设置
  wx.getSetting({
   success(res) {
    console.log('1');
    if (!res.authSetting['scope.userInfo']) {
     wx.authorize({
      scope: 'scope.userInfo',
      success() {
       // 用户已经同意小程序使用录音功能,后续调用 wx.getUserInfo接口不会弹窗询问
       wx.getUserInfo({
        success: (data) => {
         this.globalData.userInfo = data.userInfo;
         wx.setStorage({
          key: 'userInfo',
          data: data.userInfo
         })
         return this.globalData.userInfo;
        }
       })
      }
     })
    } else {
     console.log(2);
    }
   }
  })

 },

小结

网络请求这块,算目前开发项目中必不可少的一块加油~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 多级下拉菜单核心代码
May 21 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
Jul 12 Javascript
常用一些Javascript判断函数
Aug 14 Javascript
JavaScript执行效率与性能提升方案
Dec 21 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
关于vuex的学习实践笔记
Apr 05 Javascript
jQuery基于Ajax实现读取XML数据功能示例
May 31 jQuery
JavaScript寄生组合式继承原理与用法分析
Jan 11 Javascript
vue自定义标签和单页面多路由的实现代码
May 03 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
vue-cli3配置favicon.ico和title的流程
Oct 27 Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 #Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 #jQuery
jQuery实现菜单的显示和隐藏功能示例
Jul 24 #jQuery
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 #Javascript
微信小程序实现横向增长表格的方法
Jul 24 #Javascript
vue中使用sessionStorage记住密码功能
Jul 24 #Javascript
Vue-router 中hash模式和history模式的区别
Jul 24 #Javascript
You might like
PHP 多维数组排序实现代码
2009/08/05 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
网页自动跳转代码收集
2009/09/27 Javascript
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
Python列表推导式的使用方法
2013/11/21 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python实现文本文件合并
2015/12/29 Python
numpy自动生成数组详解
2017/12/15 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
Python通过属性手段实现只允许调用一次的示例讲解
2018/04/21 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
python3中数组逆序输出方法
2020/12/01 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
初中三年学生的学习自我评价
2013/11/13 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
给校长的建议书
2014/03/12 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
上诉答辩状范文
2015/05/22 职场文书
公司欠款证明
2015/06/24 职场文书
培训后的感想
2015/08/07 职场文书
初中政治教师教学反思
2016/02/23 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python