84 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| }
 |