You've already forked guangan-mp
1.0.0
This commit is contained in:
83
uni_modules/uni-ajax/js_sdk/lib/helpers/buildURL.js
Normal file
83
uni_modules/uni-ajax/js_sdk/lib/helpers/buildURL.js
Normal file
@ -0,0 +1,83 @@
|
||||
import { forEach, isArray } from '../utils'
|
||||
|
||||
/**
|
||||
* 根据 baseURL 和 url 拼接
|
||||
* @param {string} baseURL 请求根地址
|
||||
* @param {string} relativeURL 请求参数地址
|
||||
* @returns {string} 拼接后的地址
|
||||
*/
|
||||
function combineURL(baseURL = '', relativeURL = '') {
|
||||
// 判断是否 http:// 或 https:// 开头
|
||||
if (/^https?:\/\//.test(relativeURL)) return relativeURL
|
||||
// 去除 baseURL 结尾斜杠,去除 relativeURL 开头斜杠,再判断拼接
|
||||
return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL
|
||||
}
|
||||
|
||||
function encode(val) {
|
||||
return encodeURIComponent(val)
|
||||
.replace(/%3A/gi, ':')
|
||||
.replace(/%24/g, '$')
|
||||
.replace(/%2C/gi, ',')
|
||||
.replace(/%20/g, '+')
|
||||
.replace(/%5B/gi, '[')
|
||||
.replace(/%5D/gi, ']')
|
||||
}
|
||||
|
||||
function querystring(url, params) {
|
||||
let query
|
||||
|
||||
const parts = []
|
||||
forEach(params, (val, key) => {
|
||||
if (val === null || typeof val === 'undefined') return
|
||||
|
||||
if (isArray(val)) key = key + '[]'
|
||||
else val = [val]
|
||||
|
||||
forEach(val, v => {
|
||||
if (v !== null && typeof v === 'object') {
|
||||
v = JSON.stringify(v)
|
||||
}
|
||||
parts.push(encode(key) + '=' + encode(v))
|
||||
})
|
||||
})
|
||||
query = parts.join('&')
|
||||
|
||||
if (query) {
|
||||
const hashmarkIndex = url.indexOf('#')
|
||||
hashmarkIndex !== -1 && (url = url.slice(0, hashmarkIndex))
|
||||
url += (url.indexOf('?') === -1 ? '?' : '&') + query
|
||||
}
|
||||
|
||||
return url
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 baseURL、url、params query 编译请求URL
|
||||
* @returns {string} 处理后的地址
|
||||
*/
|
||||
export default function buildURL({ baseURL, url: relativeURL, params, query } = {}) {
|
||||
let url = combineURL(baseURL, relativeURL)
|
||||
|
||||
if (!params && !query) {
|
||||
return url
|
||||
}
|
||||
|
||||
if (params) {
|
||||
if (/\/:/.test(url)) {
|
||||
// 是否是 params 参数地址,并对应设置
|
||||
forEach(params, (val, key) => {
|
||||
url = url.replace(`/:${key}`, `/${encode(String(val))}`)
|
||||
})
|
||||
} else if (!query) {
|
||||
// 兼容旧的 params 属性设置 query
|
||||
url = querystring(url, params)
|
||||
}
|
||||
}
|
||||
|
||||
// 设置 query 参数
|
||||
if (query) {
|
||||
url = querystring(url, query)
|
||||
}
|
||||
|
||||
return url
|
||||
}
|
Reference in New Issue
Block a user