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


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 相关文章推荐
一些技巧性实用js代码小结
Oct 14 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
javascript操作ul中li的方法
May 14 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
Javascript获取随机数的实现方法
Jun 22 Javascript
Bootstrap3 内联单选和多选框
Dec 29 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
jQuery实现的简单图片轮播效果完整示例
Feb 08 jQuery
详解关于Angular4 ng-zorro使用过程中遇到的问题
Dec 05 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
vue组件内部引入外部js文件的方法
Jan 18 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
关于手调机和数调机的选择
2021/03/02 无线电
php公用函数列表[正则]
2007/02/22 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
在django中自定义字段Field详解
2019/12/03 Python
python 模拟登陆163邮箱
2020/12/15 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
如何进行有效的自我评价
2013/09/27 职场文书
会计实习自我鉴定
2013/12/04 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
企业后勤岗位职责
2014/02/28 职场文书
财产保全担保书范文
2014/04/01 职场文书
小学家长评语大全
2014/04/16 职场文书
安全承诺书
2015/01/19 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL