# wxapp-http
[![Build Status](https://travis-ci.org/axetroy/wxapp-http.svg?branch=master)](https://travis-ci.org/axetroy/wxapp-http)
[![Dependency](https://david-dm.org/axetroy/wxapp-http.svg)](https://david-dm.org/axetroy/wxapp-http)
![License](https://img.shields.io/badge/license-MIT-green.svg)
[![Prettier](https://img.shields.io/badge/Code%20Style-Prettier-green.svg)](https://github.com/prettier/prettier)
![Node](https://img.shields.io/badge/node-%3E=6.0-blue.svg?style=flat-square)
[![npm version](https://badge.fury.io/js/@axetroy/wxapp-http.svg)](https://badge.fury.io/js/wxapp-http)

微信小程序的http模块，机智得“绕过”最大5个http并发的限制.

![sceenshot](https://github.com/axetroy/wxapp-http/raw/master/screenshot.gif)

## Installation
```bash
npm install wxapp-http
```

[example](https://github.com/axetroy/wxapp-http/tree/master/example)

## Features

- [x] 更优雅的API
- [x] http请求的拦截器
- [x] http请求的事件监听器
- [x] http请求返回promise
- [x] http请求队列化，规避小程序的并发限制
- [x] 自定义http请求的最高并发数量

TODO: 
> 1.0.0正式版本将基于[@axetroy/event-emitter.js](https://github.com/axetroy/event-emitter.js) 事件管理将实现真正的发布/订阅者模式

## Usage

```javascript

// es6
import http from 'wxapp-http';

// commonJS
const http = require('wxapp-http').default;

http.get('https://www.google.com')
    .then(function(response){
      
    })
    .catch(function(error){
      console.error(error);
    });
```

## API

### Response

Response返回的结构体

```typescript
interface Response${
  data: any,
  errMsg: string,
  header: Object,
  statusCode: number
}
```

#### http.request

```typescript
Http.prototype.request = function(method:string, url:string, body?:Object | string="", headers?: Object={}, dataType?: String="json"): Promise<Response$>{
  
}
```

#### http.get

```typescript
Http.prototype.get = function(url:string, body?:Object | string="", headers?: Object={}, dataType?: String="json"): Promise<Response$>{
  
}
```

#### http.post

```typescript
Http.prototype.post = function(url:string, body?:Object | string="", headers?: Object={}, dataType?: String="json"): Promise<Response$>{
  
}
```

...

#### 以及OPTIONS, HEAD, PUT, DELETE, TRACE, CONNECT 请求, 参数同上

### 拦截器

配置文件字段

```typescript
interface Config${
  method: string,
  url: string,
  data: Object | string,
  header: Object,
  dataType: string
}

```

#### 请求拦截器

返回布尔值，如果为true，则允许发送请求，如果为false，则拒绝发送请求，并且返回的promise进入reject阶段

```typescript
Http.prototype.requestInterceptor = function(func:(config: Config$)=> boolean): void{
  
}

http.requestInterceptor(function(config){
  // 只允许发送https请求
  if(config.url.indexOf('https')===0){
    return true;
  }else{
    return false;
  }
});
```

#### 响应拦截器

返回布尔值，如果为true，则返回的promise进入resolve阶段，如果为false，则进入reject阶段

```typescript
Http.prototype.responseInterceptor = function(func:(config: Config$, response: Response$)=> boolean): void{
  
}

http.responseInterceptor(function(config, response){
  // 如果服务器返回null，则进入reject
  if(response && response.data!==null){
    return true;
  }else{
    return false;
  }
});
```

### 监听器

监听全局的http请求

#### 请求发出前

```typescript
Http.prototype.onRequest = function(func:(config: Config$)=> void): void{
  
}


http.onRequest(function(config){
  console.log(`will send http request: `, config.url);
});

```

#### 请求成功后

```typescript
Http.prototype.onSuccess = function(func:(config: Config$, response: Response$)=> void): void{
  
}

http.onSuccess(function(config, response){
  console.log(`http request done: `, config.url);
});
```

#### 请求失败后

```typescript
Http.prototype.onFail = function(func:(config: Config$, response: Response$)=> void): void{
  
}

http.onFail(function(config, response){
  console.log(`http request fail: `, config.url);
});
```

#### 请求完成后，无论成功或者失败

```typescript
Http.prototype.onComplete = function(func:(config: Config$, response: Response$)=> void): void{
  
}

http.onComplete(function(config, response){
  console.log(`http request complete: `, config.url);
});
```

#### 错误监听

```typescript
Http.prototype.onError = function(func:(error: Error)=> void): void{
  
}

http.onError(function(error){
  console.error(error);
});
```

### 生命周期

```
        requestInterceptor 
                ↓
            onRequest
            ↙    ↘
     onSuccess    onFail
            ↘    ↙
        responseInterceptor
                ↓
            onComplete
    (onError run in hole life circle)
```

### 清除请求队列

适用于小程序页面切换后，取消掉未发出去的http请求.

```typescript
Http.prototype.clean = function() : void{
  
}

http.clean();
```

### 自定义最高并发数量

最高并发数量默认为5个

```javascript
import {Http} from 'wxapp-http';

const http = new Http(3); // 设置最高并发3个

http.get('https://www.google.com')
    .then(function(response){
      
    })
    .catch(function(error){
      console.error(error);
    });
```

## Contributing

```bash
git clone https://github.com/axetroy/wxapp-http.git
cd ./wxapp-http
yarn
yarn run start
```

1. 打开微信web开发者工具， 加载wxapp-http/example目录
2. 修改index.js

You can flow [Contribute Guide](https://github.com/axetroy/wxapp-http/blob/master/contributing.md)

## Contributors

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
| [<img src="https://avatars1.githubusercontent.com/u/9758711?v=3" width="100px;"/><br /><sub>Axetroy</sub>](http://axetroy.github.io)<br />[💻](https://github.com/gpmer/gpm.js/commits?author=axetroy) 🔌 [⚠️](https://github.com/gpmer/gpm.js/commits?author=axetroy) [🐛](https://github.com/gpmer/gpm.js/issues?q=author%3Aaxetroy) 🎨 |
| :---: |
<!-- ALL-CONTRIBUTORS-LIST:END -->

## License

The [MIT License](https://github.com/axetroy/wxapp-http/blob/master/LICENSE)
