apib
Version:
An API basic client.
110 lines (100 loc) • 2.73 kB
JavaScript
import { version } from '../package.json'
class API {
version = version
/**
* 将对象转为 URL QueryString
*
* @param {object} data
*/
param(data) {
// https://jsperf.com/array-push-vs-string-concat
/*
let ret = []
Object.keys(data).forEach(v => {
ret.push(`${encodeURIComponent(v)}=${encodeURIComponent(data[v])}`)
})
return ret.join('&')
*/
let ret = ''
Object.keys(data).forEach(v => {
ret = ret + `${encodeURIComponent(v)}=${encodeURIComponent(data[v])}&`
})
return ret.slice(0, -1)
}
/**
* 类型判断
*
* @param {any} unknown
* @param {boolen} keepCase 保持大小写
* @return {string}
*/
type(unknown, keepCase) {
const type = Object.prototype.toString.call(unknown).slice(8, -1)
// https://jsperf.com/replace-vs-slice/5
// return type.replace('[object ', '').replace(']', '').toLowerCase()
return keepCase ? type : type.toLowerCase()
}
/**
* 将参数列表转为对象形式
*
* @param {array} list 参数原始对象,即 arguments
* @param {array} names 参数名称对应的数组,可以给默认值,默认值需要能被 JSON.parse 解析。
*
* 注意:
* - 参数的值支持覆盖
* - 在遇到对象之后直接退出
*
* 示例:
* > args([1, 2, {xor: true}], ['offset', 'count'])
* < {offset: 1, count: 2, xor: true}
*/
args(list, names = []) {
const options = {}
names.forEach((item, index) => {
if (item.indexOf('=') > -1) {
const temp = item.split('=')
const name = temp[0]
names[index] = name
try {
options[name] = JSON.parse(temp.slice(1).join('='))
} catch (e) {
// ignore
}
}
})
for (let i = 0; i < list.length; i++) {
const item = list[i]
const name = names[i]
if (this.type(item) === 'object') {
Object.assign(options, item)
break
} else if (
this.type(item) !== 'undefined'
&& this.type(name) !== 'undefined'
) {
options[name] = item
}
}
return options
}
/**
* 拼接链接地址
*
* @param {array<string>} args
*/
join(...args) {
let result = args[0] || ''
for (let i = 1; i < args.length; i++) {
if (args[i]) {
result = result.replace(/\/+$/, '') + '/' + args[i].replace(/^\/+/, '')
}
}
return result
}
// 需要自行实现 request 方法,基础方法不再进行提供
request() {
throw new Error('Not implemented yet')
}
}
export default API