request.js
3.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* Request:请求封装
* @property {Object} config = 私有属性,默认值
* @property {Function} isUrl = 私有方法,url是否完整
* @property {Function} requestBefore = 私有方法,请求前
* @property {Function} requestAfter = 私有方法,请求后
*/
import {
API_URL
} from '@/env'
import platform from '@/shopro/platform/index';
export default class Request {
constructor() {
// 默认配置
this.config = {
baseUrl: API_URL,
header: {
'content-type': 'application/json',
'platform': platform.get()
},
url: '',
data: {},
params: {},
method: 'GET',
dataType: 'json',
// #ifndef MP-ALIPAY || APP-PLUS
responseType: 'text',
// #endif
custom: {},
// #ifdef APP-PLUS
sslVerify: false
// #endif
}
/* 拦截器 */
this.interceptor = {
request: cb => {
if (cb) {
this.requestBefore = cb
} else {
this.requestBefore = request => request
}
},
response: (cb) => {
if (cb) {
this.requestAfter = cb
} else {
this.requestAfter = response => response
}
}
}
}
/* 判断url是否完整 */
static isUrl(url) {
return /(http|https):\/\/([\w.]+\/?)\S*/.test(url)
}
static addQueryString(params) {
let paramsData = ''
Object.keys(params).forEach(key => {
paramsData += key + '=' + encodeURIComponent(params[key]) + '&'
})
return paramsData.substring(0, paramsData.length - 1)
}
/* 请求前 */
static requestBefore(config) {
return config
}
/* 请求后 */
static requestAfter(response) {
return response
}
/*设置全局配置*/
setConfig(func) {
return func(this.config)
}
/**
* @Function
* @param {Object} options - 请求配置项
* @prop {String} options.url - 请求路径
* @prop {Object} options.data - 请求参数
* @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
* @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
* @prop {Object} [options.header = config.header] - 请求header
* @prop {Object} [options.method = config.method] - 请求方法
* @returns {Promise<unknown>}
*/
async request(options = {}) {
options = {
...options,
...this.config,
...this.requestBefore(options)
}
return new Promise((resolve, reject) => {
let mergeUrl = Request.isUrl(options.url) ? options.url : (options.baseUrl + options.url)
if (JSON.stringify(options.params) !== '{}') {
let query = Request.addQueryString(options.params);
mergeUrl += mergeUrl.indexOf('?') === -1 ? `?${query}` : `&${query}`
}
options.url = mergeUrl
options.success = res => {
resolve(this.requestAfter(res.data))
}
options.fail = err => {
reject(this.requestAfter(err))
}
uni.request(options)
})
}
get(url, options = {}) {
return this.request({
url,
method: 'GET',
...options
})
}
post(url, data, options = {}) {
return this.request({
url,
data,
method: 'POST',
...options
})
}
}