An open API service indexing awesome lists of open source software.

https://github.com/x-extends/xe-ajax-mock

☘ 基于 xe-ajax 的 Mock 虚拟服务
https://github.com/x-extends/xe-ajax-mock

xe-ajax

Last synced: 2 months ago
JSON representation

☘ 基于 xe-ajax 的 Mock 虚拟服务

Awesome Lists containing this project

README

        

# xe-ajax-mock

[![gitee star](https://gitee.com/x-extends/xe-ajax-mock/badge/star.svg?theme=dark)](https://gitee.com/x-extends/xe-ajax-mock/stargazers)
[![npm version](https://img.shields.io/npm/v/xe-ajax-mock.svg?style=flat-square)](https://www.npmjs.com/package/xe-ajax-mock)
[![npm build](https://travis-ci.com/x-extends/xe-ajax-mock.svg?branch=master)](https://travis-ci.com/x-extends/xe-ajax-mock)
[![npm downloads](https://img.shields.io/npm/dm/xe-ajax-mock.svg?style=flat-square)](http://npm-stat.com/charts.html?package=xe-ajax-mock)
[![gzip size: JS](http://img.badgesize.io/https://unpkg.com/xe-ajax-mock/dist/xe-ajax-mock.umd.min.js?compression=gzip&label=gzip%20size:%20JS)](https://unpkg.com/xe-ajax-mock/dist/xe-ajax-mock.umd.min.js)
[![npm license](https://img.shields.io/github/license/mashape/apistatus.svg)](LICENSE)

基于 xe-ajax 的 Mock 虚拟服务

## Browser Support

![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png)
--- | --- | --- | --- | --- | --- |
9+ ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |

## Installing

```shell
npm install xe-ajax xe-ajax-mock

```

```javascript
import XEAjax from 'xe-ajax'
import XEAjaxMock from 'xe-ajax-mock'

XEAjax.use(XEAjaxMock)
```

Get on [unpkg](https://unpkg.com/xe-ajax-mock/) and [cdnjs](https://cdn.jsdelivr.net/npm/xe-ajax-mock/)

```HTML

```

## API

* Mock( defines, options )
* Mock( path, method, response, options )
* HEAD( path, response, options )
* GET( path, response, options )
* POST( path, response, options )
* PUT( path, response, options )
* DELETE( path, response, options )
* PATCH( path, response, options )
* JSONP( path, response, options )

### Arguments

* **path** 请求路径
* **method** 请求方法
* **response** 对象或者函数(request, response, context),格式: {status: 200, statusText: 'OK', body: {}, headers: {}}
* **options** 参数

### 参数

| Name | Type | Description | default value |
|------|------|-----|----|
| baseURL | String | 基础路径 | 默认上下文路径 |
| template | Boolean | 是否允许数据模板自动编译, 可以设置 [**true**,**false**] | 默认 false |
| pathVariable | Boolean | 是否启用路径参数类型自动解析, 可以设置 [**true**,**false**,'auto'] | 默认 true |
| timeout | String | 设置请求响应的时间 | 默认 '20-400' |
| jsonp | String | 设置jsonp回调参数名称 | |
| headers | Object | 设置响应头信息 | |
| error | Boolean | 控制台输出请求错误日志, 可以设置 [**true**,**false**] | 默认 true |
| log | Boolean | 控制台输出请求请求日志, 可以设置 [**true**,**false**] | 默认 false |

## 全局参数

```javascript
import XEAjaxMock from 'xe-ajax-mock'

XEAjaxMock.setup({
baseURL: 'http://xuliangzhan.com',
template: true,
pathVariable: 'auto', // 如果为auto则支持自动转换类型
timeout: '50-600',
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
error: true,
log: true
})
```

## Template - 基础语法

### Number 数值

[key]|number

```javascript
import { template } from 'xe-ajax-mock'

template({
'num|number': '123'
})
// {num: 123}
```

### Boolean 布尔值

[key]|boolean

```javascript
import { template } from 'xe-ajax-mock'

template({
'flag1|boolean': 'true',
'flag2|boolean': 'false'
})
// {flag1: true, flag2: false}
```

### 指定生成一个或多个值

[key]|array([min]-[max])

```javascript
import { template } from 'xe-ajax-mock'

template({
'region|array(1-5)': 'val'
})
// {region: ['val', 'val', 'val']}

template({
'region|array(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"]
})
// {region: ['beijing']}

template({
'region|array(1-3)': ["beijing", "shanghai", "guangzhou", "shenzhen"]
})
// {region: ['shenzhen', 'shanghai']}
```

### 随机生成一个或多个值

[key]|random([min]-[max])

```javascript
import { template } from 'xe-ajax-mock'

template({
'region|random(1-5)': 'val'
})
// {region: ['val', 'val', 'val']}

template({
'region|random(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"]
})
// {region: 'shanghai'}

template({
'region|random(1-3)': ["beijing", "shanghai", "guangzhou", "shenzhen"]
})
// {region: ['beijing', 'guangzhou']}
```

### Object 对象

```javascript
import { template } from 'xe-ajax-mock'

template({
'id|number': '1',
'name': 'test 1',
'region|array(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"],
'active|boolean': '1'
'age|number': '30'
})
// {id: 1,name: 'test 1', region: ['shanghai'], active: true, age: 30}
```

### Array 数组

```javascript
import { template } from 'xe-ajax-mock'

template(['{{ random.repeat("abcdefg",10,20) }}', '{{ random.date("2018-03-04","2018-03-20") }}'])
// ['gbabcdefega', '2018-03-13 14:52:02']

template([{
'id|number': '1',
'name': 'test1',
'region|array(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"],
'active|boolean': '0',
'age|number': '30'
}])
// [{id: 1,name: 'test 0', region: ['guangzhou'], active: false, age: 30}]
```

### 内置变量

**$size** 获取数组大小
**$index** 获取数组索引
**$params** 获取请求查询参数
**$body** 获取请求提交参数
**$pathVariable** 获取请求路径参数

```javascript
import { template } from 'xe-ajax-mock'

template({
'result|array(1-5)': {
'id|number': '{{ $index }}',
'size|number': '{{ $size }}',
'name': '{{ $params.name }}',
'password': '{{ $body.password }}'
}
})
// {
// age: {pageSize: 10, currentPage: 1},
// result: [
// {id: 0, size: 2, name: 'test', password: ''},
// {id: 1, size: 2, name: 'test', password: ''}
// ]
// }
```

### 直接返回对应的值

**~** 如果对象中只有一个属性,返回对应值

```javascript
import { template } from 'xe-ajax-mock'

template({
'~': {
'id|number': '1',
'name': 'test {{ $index }}',
'region|array(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"],
'active|boolean': '{{ random.num(0,1) }}',
'age|number': '{{ random.num(18,60) }}'
}
})
// {id: 1, name: 'test 0', region: ['shenzhen'], active: true, age: 30}

template({
'~|array(1-2)': {
'id|number': '{{ $index+1 }}',
'name': 'test {{ $index }}',
'region|array(1)': ["beijing", "shanghai", "guangzhou", "shenzhen"],
'active|boolean': '{{ random.num(0,1) }}',
'age|number': '{{ random.num(18,60) }}'
}
})
// [{id: 1, name: 'test 0', region: ['shanghai'], active: true, age: 30},
// {id: 2, name: 'test 1', region: ['shenzhen'], active: false, age: 42}]
```

## Template - 函数的使用

### 随机生成数值

random.num(min, max)

```javascript
import { template } from 'xe-ajax-mock'

template({
'age': '{{ random.num(18,60) }}'
})
// {age: '30'}

template({
'ip': '{{ random.num(1,254) }}.{{ random.num(1,254) }}.{{ random.num(1,254) }}.{{ random.num(1,254) }}'
})
// {ip: '147.136.43.175'}

template({
'color': 'rgb({{ random.num(100,120) }}, {{ random.num(140,180) }}, {{ random.num(140,160) }})'
})
// {color: 'rgb(242, 121, 132)'}
```

### 根据内容随机生成(可以是字符串或数组)

random.repeat(array|string, min, max)

```javascript
import { template } from 'xe-ajax-mock'

template({
'describe': '{{ random.repeat("abcdefg",10,200) }}'
})
// {describe: 'bacdeggaccedbga'}

template({
'email': '{{ random.repeat("abcdefg",5,20) }}@163.{{ random.repeat(["com","net"],1) }}'
})
// {email: '[email protected]'}
```

### 随机时间戳

random.time(startDate, endDate)

```javascript
import { template } from 'xe-ajax-mock'

template({
'datetime': '{{ random.time("2018-03-04") }}'
})
// {datetime: '1520092800000'}

template({
'datetime': '{{ random.time("2018-03-04","2018-03-20") }}'
})
// {datetime: '1520611200000'}
```

### 随机日期

random.date(startDate, endDate, format)

```javascript
import { template } from 'xe-ajax-mock'

template({
'dateStr': '{{ random.date("2018-03-04") }}'
})
// {dateStr: '2018-03-04'}

template({
'dateStr': '{{ random.date("2018-03-04",null,"yyyy-MM-dd HH:mm:ss.S") }}'
})
// {dateStr: '2018-03-04 00:00:00.0'}

template({
'dateStr': '{{ random.date("2018-03-04","2018-03-20") }}'
})
// {dateStr: '2018-03-10'}

template({
'dateStr': '{{ random.date("2018-03-04","2018-03-20","yyyy-MM-dd HH:mm:ss.S") }}'
})
// {dateStr: '2018-03-10 10:30:20.500'}
```

### 完整配置

```javascript
import { template } from 'xe-ajax-mock'

// GET('http://xuliangzhan.com/api/user/list/{pageSize/{currentPage}') ==> XEAjax.fetchGet('api/user/list/10/1')
template({
"page": {
"currentPage|number": "{{ $pathVariable.currentPage }}",
"pageSize|number": "{{ $pathVariable.pageSize }}",
"totalResult|number": "{{ random.num(100,200) }}"
},
"result|array({{ $pathVariable.pageSize }})": {
"id|number": "{{ $index+1 }}",
"name": "test {{ $index }}",
"region|random(1)": ["beijing", "shanghai", "guangzhou", "shenzhen"],
"roles|array(1-3)": ["admin", "developer", "tester", "designer"],
"isLogin|boolean": "{{ random.num(0,1) }}",
"email": "{{ random.repeat('abcdefg',5,20) }}@qq.{{ random.repeat(['com','net'],1) }}",
"color": "rgb(120, {{ random.num(140,180) }}, {{ random.num(140,160) }})",
"ip": "192.168.{{ random.num(1,254) }}.{{ random.num(1,254) }}",
"age|number": "{{ random.num(18,60) }}",
"password": "{{ random.num(100000,999999) }}",
"describe": "{{ random.repeat('abcdefg',10,200) }}",
"createDate": "{{ random.date('2018-01-01','2018-06-20') }}",
"updateTime": "{{ random.time('2018-01-01','2018-06-20') }}"
}
})
```

### Template 模板混合函数

template.mixin({})

```javascript
import { template } from 'xe-ajax-mock'

template.mixin({
format (str) {
return 'format: ' + str
}
})

template({
'val': '{{ format("2018-01-01") }}'
})
// {val: 'format: 2018-01-01'}
```

## Example

[example](https://github.com/xuliangzhan/vue-mock-template)

### Mock

```javascript
import { Mock } from 'xe-ajax-mock'

Mock([{
path: '/api/user',
children: [{
method: 'GET',
path: 'list',
response: {
'~|array(1-3)': {
'id|number': '{{ $index+1 }}',
'name': '{{ random.repeat("abcdefg",4,20) }}'
}
},
}, {
method: 'POST',
path: 'submit',
response: {msg: 'success'},
},
{
method: 'DELETE',
path : 'delete/{id}',
response (request, response) {
response.status = 500
response.body = {msg: 'error'}
return response
}
]
}])
```

### HEAD

```javascript
import { HEAD } from 'xe-ajax-mock'

HEAD('/api/user/head', null)
```

### GET

```javascript
import { GET } from 'xe-ajax-mock'

GET('/api/user/list', {msg: 'success'})

GET('/api/user/list', (request, response) => {
response.status = 200
response.statusText = 'OK'
response.body = {
'~|array(1-3)': {
'id|number': '{{ $index+1 }}',
'name': '{{ random.repeat("abcdefg",4,20) }}'
}
}
return response
})

GET('/api/user/list/{pageSize}/{currentPage}', (request, response, { pathVariable }) => {
response.body = {
'page': {
'currentPage|number': '{{ $pathVariable.currentPage }}',
'pageSize|number': '{{ $pathVariable.pageSize }}'
},
'result|array(2-5)': {
'id|number': '{{ $index+1 }}',
'name': '{{ random.repeat("abcdefg",4,20) }}'
}
}
return response
})
```

### POST

```javascript
import { template, POST } from 'xe-ajax-mock'

POST('/api/user/save', {msg: 'success'})

POST('/api/user/save', (request, response) => {
response.body = {msg: 'success'}
return response
})

POST('/api/user/save', (request, response) => {
// 简单模拟后台校验
if (request.params.id) {
response.body = {msg: 'success'}
} else {
response.status = 500
response.body = {msg: 'error'}
}
return response
})
```

### PUT

```javascript
import { PUT } from 'xe-ajax-mock'

PUT('/api/user/update', {msg: 'success'})

PUT('/api/user/update', (request, response) => {
response.status = 500
response.body = {msg: 'error'}
return response
})
```

### DELETE

```javascript
import { DELETE } from 'xe-ajax-mock'

DELETE('/api/user/delete/{id}', {msg: 'success'})

DELETE('/api/user/delete/{id}', (request, response) => {
response.body = {msg: 'success'}
return response
})
```

### PATCH

```javascript
import { PATCH } from 'xe-ajax-mock'

PATCH('/api/user/update', {msg: 'success'})
```

### JSONP

```javascript
import { JSONP } from 'xe-ajax-mock'

JSONP('http://xuliangzhan.com/jsonp/user/message', {msg: 'success'})

JSONP('http://xuliangzhan.com/jsonp/user/message', (request, response) => {
response.body = {
'~|array(1-3)': {
'id|number': '{{ $index+1 }}',
'name': '{{ random.repeat("abcdefg",4,20) }}'
}
}
return response
}, {jsonp: 'cb'})
```

## License

[MIT](LICENSE) © 2017-present, Xu Liangzhan