Files
guangan-mp/uni_modules/uni-ajax/js_sdk/lib/helpers/buildURL.js
2025-06-16 10:09:19 +08:00

84 lines
2.1 KiB
JavaScript

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
}