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

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

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

看了下小程序的请求方式大概和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. asp.net使用动态模版导出word

    具体思路: 1.先制作Word模版,使用文本框+书签的方式来设计模版: 2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件: 3.后台取得数据,参照网页渲染的方 ...

  2. 【刷题】LOJ 6003 「网络流 24 题」魔术球

    题目描述 假设有 \(n\) 根柱子,现要按下述规则在这 \(n\) 根柱子中依次放入编号为 \(1, 2, 3, 4, \cdots\) 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任 ...

  3. SpringBoot入坑指南之六:使用过滤器或拦截器

    在Web应用中,常常存在拦截全部或部分请求进行统一处理的应用场景,如权限校验.参数校验.性能监控等. 在SpringMVC框架中,我们可以通过过滤器或拦截器实现相关功能,spring-boot-sta ...

  4. 【BZOJ1797】[AHOI2009]最小割(网络流)

    [BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...

  5. php 访问错误日志

    /usr/local/php/var/log/php-fpm.log」—————————

  6. Javascript面向

    一.前言 面向对象:专注于由哪一个对象来解决这个问题,编程特点是出现了一个类,从类中拿到对象,由这个对象去解决具体问题.       对于调用者来说,面向过程需要调用者自己去实现各种函数.而面向对象, ...

  7. angular模块

    深入浅析AngularJS中的模块 模块是AngularJS应用程序的一个组成部分,模块可以是一个Controller.Service服务.Filter过滤器.directive指令,这些都属于模块. ...

  8. CF&&CC百套计划4 Codeforces Round #276 (Div. 1) A. Bits

    http://codeforces.com/contest/484/problem/A 题意: 询问[a,b]中二进制位1最多且最小的数 贪心,假设开始每一位都是1 从高位i开始枚举, 如果当前数&g ...

  9. Java SSM框架之MyBatis3(二)MyBatis之Mapper代理的开发方式

    Mapper代理的开发规范 1. mapper接口的全限定名要和mapper映射文件的namespace值一致. 2. mapper接口的方法名称要和mapper映射文件的statement的id一致 ...

  10. 基于JWT(Json Web Token)的ASP.NET Web API授权方式

    token应用流程 初次登录:用户初次登录,输入用户名密码 密码验证:服务器从数据库取出用户名和密码进行验证 生成JWT:服务器端验证通过,根据从数据库返回的信息,以及预设规则,生成JWT 返还JWT ...