公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意。

于是上网查了一下,就开始着手开发。。。。。

首先开发客户端的东西,都有个共同点,那就是  数据请求!

看了下小程序的请求方式大概和ajax请求差不多,所以先打好基础 从封装http请求开始

好了废话不多说了,上代码

首先。。。。当然是建立配置文件,用来配置请求根路径 config.js

export default {
basePath: 'http://192.168.6.2:9002/api',
fileBasePath: 'http://192.168.6.2:9002',
//basePath: 'http://127.0.0.1:8989/api',
//fileBasePath: 'http://127.0.0.1:8989',
defaultImgUrl:'/pages/Images/default.png'
}

这里我用到es6来写逻辑代码 所以自行引用兼容代码es6-promise.js

下面是核心代码 ServiceBase.js

import __config from '../etc/config'
import es6 from '../assets/plugins/es6-promise' class ServiceBase {
constructor() {
Object.assign(this, {
$$basePath: __config.basePath
})
this.__init()
} /**
* __init
*/
__init() {
this.__initDefaults()
this.__initMethods()
} /**
* __initDefaults
*/
__initDefaults() {
// 方法名后缀字符串
this.suffix = 'Request' // 发起请求所支持的方法
this.instanceSource = {
method: [
'OPTIONS',
'GET',
'HEAD',
'POST',
'PUT',
'DELETE',
'TRACE',
'CONNECT',
]
}
} /**
* 遍历对象构造方法,方法名以小写字母+后缀名
*/
__initMethods() {
for (let key in this.instanceSource) {
this.instanceSource[key].forEach((method, index) => {
this[method.toLowerCase() + this.suffix] = (...args) => this.__defaultRequest(method, ...args)
})
}
} /**
* 以wx.request作为底层方法
* @param {String} method 请求方法
* @param {String} url 接口地址
* @param {Object} params 请求参数
* @param {Object} header 设置请求的 header
* @param {String} dataType 请求的数据类型
*/
__defaultRequest(method = '', url = '', params = {}, header = {}, dataType = 'json') {
const $$header = Object.assign({}, this.setHeaders(), header)
const $$url = this.setUrl(url) // 注入拦截器
const chainInterceptors = (promise, interceptors) => {
for (let i = 0, ii = interceptors.length; i < ii;) {
let thenFn = interceptors[i++]
let rejectFn = interceptors[i++]
promise = promise.then(thenFn, rejectFn)
}
return promise
}
//加入token信息
params.AccessToken = wx.getStorageSync('token');
params.Version = wx.getStorageSync('Version')||"20151101";
// 请求参数配置
const $$config = {
url: $$url,
data: params,
header: $$header,
method: method,
dataType: dataType,
} let requestInterceptors = []
let responseInterceptors = []
let reversedInterceptors = this.setInterceptors()
let promise = this.__resolve($$config) // 缓存拦截器
reversedInterceptors.forEach((n, i) => {
if (n.request || n.requestError) {
requestInterceptors.push(n.request, n.requestError)
}
if (n.response || n.responseError) {
responseInterceptors.unshift(n.response, n.responseError)
}
}) // 注入请求拦截器
promise = chainInterceptors(promise, requestInterceptors) // 发起HTTPS请求
promise = promise.then(this.__http) // 注入响应拦截器
promise = chainInterceptors(promise, responseInterceptors) // 接口调用成功,res = {data: '开发者服务器返回的内容'}
promise = promise.then(res => res.data, err => err) return promise
} /**
* __http - wx.request
*/
__http(obj) {
return new es6.Promise((resolve, reject) => {
obj.success = (res) => resolve(res)
obj.fail = (res) => reject(res)
wx.request(obj)
})
} /**
* __resolve
*/
__resolve(res) {
return new es6.Promise((resolve, reject) => {
resolve(res)
})
} /**
* __reject
*/
__reject(res) {
return new es6.Promise((resolve, reject) => {
reject(res)
})
} /**
* 设置请求路径
*/
setUrl(url) {
return `${this.$$basePath}${this.$$prefix}${url}`
} /**
* 设置请求的 header , header 中不能设置 Referer
*/
setHeaders() {
return {
// 'Accept': 'application/json',
// 'Content-type': 'application/json',
"Content-Type": "application/x-www-form-urlencoded"
//'Authorization': 'Bearer ' + wx.getStorageSync('token')
}
} /**
* 设置request拦截器
*/
setInterceptors() {
return [{
request: (request) => {
request.header = request.header || {}
request.requestTimestamp = new Date().getTime()
    
//如果token在header中 token在参数中注入if (request.url.indexOf('/api') !== -1 && wx.getStorageSync('token')) {
//request.header.Authorization = 'T ' + wx.getStorageSync('token') }
wx.showToast({
title: '加载中',
icon: 'loading',
duration: 10000,
mask: !0,
})
return request
},
requestError: (requestError) => {
wx.hideToast()
console.log('error-------------');
return requestError
},
response: (response) => {
console.log(response)
response.responseTimestamp = new Date().getTime()
if (response.statusCode == 401
|| response.statusCode == 403
|| (response.data.code == -1 && response.data.tips =="云客户端连接失败"))
{
wx.removeStorageSync('token')
wx.removeStorageSync('userinfo')
wx.redirectTo({
url: '/pages/login/login?isfail=true'
})
}
wx.hideToast()
return response
},
responseError: (responseError) => {
wx.hideToast()
return responseError
},
}]
}
} export default ServiceBase

下面是业务逻辑的DAO层

import ServiceBase from 'ServiceBase'

class Service extends ServiceBase {
constructor() {
super()
this.$$prefix = ''
this.$$path = {
register:'/login/weregister',//注册
signIn : '/login/login',//登陆
wechatSignIn: '/login/welogin',//微信登陆
signOut: '/login/logout',//退出 }
}
//openid和基本信息注册
register(params)
{
return this.postRequest(this.$$path.register, params)
}
//用户名密码登陆
signIn(params) {
return this.postRequest(this.$$path.signIn, params)
}
//微信登陆
wechatSignIn(params) {
return this.postRequest(this.$$path.wechatSignIn, params)
}
signOut() {
return this.postRequest(this.$$path.signOut)
} } export default Service

有人可能会问 如何进行get请求?

this.postRequest 换成 this.getRequest 即可 其他put,delete 类似

然后在全局app.js 进行引用

import HttpService from 'Core/HttpService'

App({

...

...

HttpService: new HttpService

})

最后调用方式

    signIn(cb) {
  //测试默认登陆成功
app.HttpService.signIn({
username: '571115139',
password: '666666',
})
.then(data => {
    //请求成功
console.log(data) //测试数据 cb() }).catch(e=>{
    //请求失败
    }) }

好了今天就说到这,下篇将持续更新在小程序中遇到的坑

微信小程序Http高级封装 es6 promise的更多相关文章

  1. 微信小程序初体验--封装http请求

    最近看了一下微信小程序,大致翻了一下,发现跟angular很相似的,但是比angular简单的很多具体可参考官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev ...

  2. mpvue学习笔记-之微信小程序数据请求封装

    简介 美团出品的mpvue已经开源出来很久了,一直说要进行一次实践,这不最近一次个人小程序开发就用上了它. 看了微信官方的数据请求模块--request,对比了下get和post请求的代码,发现如果在 ...

  3. 微信小程序API接口封装

    @ 目录 一,让我们看一下项目目录 二,让我们熟悉一下这三个文件目的(文件名你看着办) 三,页面js中如何使用 今天的API的封装,我们拿WX小程序开发中,对它的API (wx.request)对这个 ...

  4. 微信小程序 request请求封装

    在utils文件夹新建文件utils.js,封装代码如下: 小程序升级后内部不自带Promise方法,需外部引入Promise方法   var sendRequest = function (url, ...

  5. 微信小程序 es6-promise.js封装请求 处理异步进程

    下载es6-promise.js置于根目录下的libs文件夹下: 在根目录utils文件夹下新建httpsPromisify.js,即定义封装请求的方法 var Promise = require(' ...

  6. 微信小程序request请求封装,验签

    1/ 公共文件util添加 request请求 //简单封装请求 function request(params, path, isShowLoading = true, goBack = false ...

  7. 微信小程序自定义组件封装及父子间组件传值

    首先在我们可以直接写到需要的 page 中,然后再进行抽取组件,自定义组件建议 wxzx-xxx 命名 官网地址:https://developers.weixin.qq.com/miniprogra ...

  8. 微信小程序4 - 几个ES6基础写法

    1. 默认参数 function demo(param){ param=param || {};} 新的写法,很直观 function demo(param={}){} 2. 简化方法,如你所见,de ...

  9. 微信小程序前端function封装

    funtion的封装 utils =>http.js var tips = { 1: "没有网络", 999: "无效的请求", 5000: " ...

随机推荐

  1. Codeforces914G Sum the Fibonacci(FWT)

    FWT大杂烩.跟着模拟做很多次FWT即可. #include<iostream> #include<cstdio> #include<cmath> #include ...

  2. 【转】Keil ARM开发 error L6236E错误解决

    顺利创建了第一个Keil工程却发现不能完成链接,出现了一个下面这样的报错: .\Objects\demo_simple.sct(7): error: L6236E: No section matche ...

  3. keeplived工作原理及配置

    一.keepalived简介及作用 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能 keepal ...

  4. 造成ORA-01843 无效的月份 的一些原因

    1) 当我们在一个中文环境的客户端使用如下sql语句INSERT INTO "temptable" ( DELIVER_DATE ) VALUES (TO_DATE('27-Jun ...

  5. POJ 2387 Til the Cows Come Home (图论,最短路径)

    POJ 2387 Til the Cows Come Home (图论,最短路径) Description Bessie is out in the field and wants to get ba ...

  6. zabbix server安装(二)

    https://mp.weixin.qq.com/s/ogaqiX4vhtGLepuNf-1ItA zabbix依赖LNMP或LAMP,下面讲解LNMP安装到zabbix web页面的访问. 一.ng ...

  7. Hadoop生态圈-Kafka配置文件详解

    Hadoop生态圈-Kafka配置文件详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.默认kafka配置文件内容([yinzhengjie@s101 ~]$ more /s ...

  8. spring boot 事务配置

    事务的作用这里不细说,相信很多人也在工作中使用过. 那么在spring-boot是如何配置事务的,事实上非常简便. 直接贴代码吧. 首先配置数据源  myqlDataSource,这个就不说了.之前的 ...

  9. thinkphp自学笔记

    什么是MVC? M:编写模型类-对数据进行操作 用作数据处理 V:编写HTML文件-将页面显示出来 网页视图 C:编写类文件 用作逻辑处理 ThinkPHP的MVC的特点是什么: 它比较灵活并不依赖 ...

  10. bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=4517 组合数+错排公式 #include<cstdio> #include<ios ...