微信小程序HTTP请求从0到1封装

 更新时间:2019年09月09日 11:22:46   作者:cuiyibao  
这篇文章主要给大家介绍了关于微信小程序HTTP请求从0到1封装的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

作为一个前端开发者,从最开始的js、jQuery一把梭,后来的vue、react、angular等MVVM、MVC框架,我们在开发工程中都离不开HTTP库的使用。

HTTP库

1、jQuery的$.ajax

调用了XMLHttpRequest对象,封装在相关函数在配置项中,一旦传入了必需选项,则直接调用相应的send()方法进行数据的请求

2、Axios

基于Promise的请求库,通过判断XMLHTTPRequest对象存在与否,来支持客户端和node服务端发送请求,封装的很不错的HTTP库,支持promise、拦截请求和响应等

小程序网络请求

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

小程序本身的请求已经封装的很不错了,使用起来和$.ajax相似,支持许多配置项的设置,但是缺少公共配置、响应和请求拦截等实用功能

第一步--创建请求实例

class Axios {
 constructor() {
  this.instance = null // 类的实例
  this.config = defaultConfig
 }

 create(instanceConfig) {
  const { config } = this
  // 创建实例的时候添加基本配置
  this.config = {
   ...config,
   ...instanceConfig
  }
  return this
 }

 // 单例
 static getInstance() {
  if (!this.instance) {
    this.instance = new Axios()
  }
  return this.instance
 }
}

创建实例

const axios = Axios.getInstance()

promise包装小程序请求

const dispatchRequest = function(config) {
 return new Promise((resolve, reject) => {
  wx.request({
   ...config,
   url: config.base + config.url,
   success: res => {
    resolve(res)
   },
   fail: res => {
    reject(res)
   }
  })
 })
}

给请求实例添加request方法

request(options) {
 const { config } = this
 // 实例请求的时候添加基本配置
 const requsetOptions = {
  ...config,
  ...options
 }
 return dispatchRequest(requsetOptions)
}

第二步--创建请求工具方法

创建实例,通过create设置基本配置项

const instance = (config = {}) => {
 return axios.create({
  base: globalApi,
  ...config
 })
}

创建请求工具方法,执行实例request

export function request(options) {
 const { baseConfig, url, method, data, isLogin } = options
 instance(baseConfig)
  .request({
   url,
   method: method || 'GET',
   data
  })
  .then(res => {
   options.success && options.success(res)
  })
  .catch(err => {
   if (options.error) {
    options.error(err)
   } else {
    errAlert()
   }
  })
 }
}

这样,一个请求的工具方法就完成了,但是这个方法现在只支持基本的请求和基本配置项的配置,还是缺少我们很常用的公共请求和响应的拦截。

第三部--添加请求和响应的拦截器

创建拦截器实例

class InterceptorManager {
 constructor() {
  this.fulfilled = null
  this.rejected = null
 }

 use(fulfilled, rejected) {
  this.fulfilled = fulfilled
  this.rejected = rejected
 }
}

在请求实例的构造方法中添加请求和响应拦截实例

constructor() {
 this.instance = null // 类的实例
 this.config = defaultConfig
 this.interceptors = {
  request: new InterceptorManager(),
  response: new InterceptorManager()
 }
}

在实例的request添加promise执行队列

request(options) {
  const { config, interceptors } = this
  // 实例请求的时候添加基本配置
  const requsetOptions = {
   ...config,
   ...options
  }

  const promiseArr = [] // promise存储队列

  // 请求拦截器
  promiseArr.push({
   fulfilled: interceptors.request.fulfilled,
   rejected: interceptors.request.rejected
  })

  // 请求
  promiseArr.push({
   fulfilled: dispatchRequest,
   rejected: null
  })

  // 回调拦截器
  promiseArr.push({
   fulfilled: interceptors.response.fulfilled,
   rejected: interceptors.response.rejected
  })

  let p = Promise.resolve(requsetOptions)
  promiseArr.forEach(ele => {
   p = p.then(ele['fulfilled'], ele['rejected'])
  })

  return p
 }

在请求工具方法中通过设置请求和响应的拦截方法

axios.interceptors.request.use(
 request => {
  return request
 },
 err => {
  console.error(err)
 }
)
axios.interceptors.response.use(
 response => {
  return response
 },
 err => {
  console.error(err)
 }
)

在请求拦截方法里面可以添加数据转换,在请求头部添加sign、token等,在响应拦截方法里面去做公共的数据处理等

最后

从零搭建一个简单的请求库很简单,但是想考虑的方方面面,设计好整个流程会比较麻烦,需要不断的改进和重构,本文的搭架过程参考了Axios的部分源码。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • babel的使用及安装配置教程

    babel的使用及安装配置教程

    babel是一个广泛使用的转码器,可以将ES6代码转化为ES5代码,从而在现有环境执行。这篇文章主要介绍了babel的使用以及安装配置,需要的朋友可以参考下
    2018-02-02
  • Bootstrap选项卡动态切换效果

    Bootstrap选项卡动态切换效果

    这篇文章主要为大家详细介绍了Bootstrap选项卡动态切换效果,点击登录和注册可以实现任意切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 小程序实现分页查询列表的模板

    小程序实现分页查询列表的模板

    这篇文章主要为大家详细介绍了小程序实现分页查询列表的模板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • gridpanel动态加载数据的实例代码

    gridpanel动态加载数据的实例代码

    这篇文章介绍了gridpanel动态加载数据的实例代码,有需要的朋友可以参考一下
    2013-07-07
  • JS如何实现页面截屏功能实例代码

    JS如何实现页面截屏功能实例代码

    这篇文章主要给大家介绍了关于JS如何实现页面截屏功能的相关资料,文中主要利用了html2canvas和canvas绘制两个方法来实现,需要的朋友可以参考下
    2021-06-06
  • 理解Javascript_09_Function与Object

    理解Javascript_09_Function与Object

    在《理解Javascript_08_函数对象》中讲解了很多函数对象的问题,同时也留下了许多疑问,今天让我们来解答部分问题。
    2010-10-10
  • 详解ES6 扩展运算符的使用与注意事项

    详解ES6 扩展运算符的使用与注意事项

    扩展运算符 (spread syntax) 是 ES6 提供的一种非常便捷的新语法,给我们操作数组和对象带来了非常大的便利,我在很多文章中也提到了这个语法。但是其实扩展运算符的用法还是比较多比较杂的,我用一篇文章来做一下总结,梳理一下扩展运算的语法和使用细节。
    2020-11-11
  • javascript文本框内输入文字倒计数的方法

    javascript文本框内输入文字倒计数的方法

    这篇文章主要介绍了javascript文本框内输入文字倒计数的方法,涉及javascript针对键盘事件的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • ES6使用let命令更简单的实现块级作用域实例分析

    ES6使用let命令更简单的实现块级作用域实例分析

    这篇文章主要介绍了ES6使用let命令更简单的实现块级作用域,结合实例形式分析了ES6中let命令与var的区别及具体使用方法,需要的朋友可以参考下
    2017-03-03
  • 提高网站信任度的技巧

    提高网站信任度的技巧

    网站信任度:一方面指浏览者对于站点的信任程度,另一方面指搜索引擎对于网站的信任值(TrustRank),网站信任度对于企业站点更为重要.在得到更高信任度的同时,流量更容易转化为实在的收入.
    2008-10-10

最新评论