You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
3.0 KiB
133 lines
3.0 KiB
/**
|
|
* 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
|
|
})
|
|
}
|
|
|
|
}
|
|
|