UNPKG

jshttp

Version:

基于 Axios 的 HTTP 请求库,内置了一些常用功能,支持在任何 Javascript 环境下运行

68 lines (52 loc) 1.73 kB
'use strict' const paramsSerializer = require('./params-serializer') function isHttpUrl(url) { if (url && typeof url === 'string' && (url.startsWith('http://') || url.startsWith('https://'))) { return true } return false } function isBrowserEnv() { return typeof XMLHttpRequest === 'function' && typeof location === 'object' } /** * 合并 `baseURL` 和 `url` 生成基础部分 url */ function concatBaseURL(baseURL = '', url = '') { if (isHttpUrl(url)) { return url.replace(/\/+$/u, '') } return baseURL.replace(/\/+$/u, '') + '/' + url.replace(/^\/+/u, '').replace(/\/+$/u, '') } function decodeQs(str) { if (!str) { return {} } // 拆分为 ['name=mark','age=19'] 形式的数组 const parts = str.split('&') const obj = {} for (let i = 0; i < parts.length; i++) { const [name, value] = parts[i].split('=') if (name && value) { obj[name] = value } } return obj } function encodeQs(obj) { return paramsSerializer(obj) } module.exports = function getUrl(baseURL = '', url = '', params = {}) { if (!isHttpUrl(baseURL) && !isHttpUrl(url) && !isBrowserEnv()) { throw new Error(`配置项 \`baseURL\` 和 \`url\` 至少需要有一个是以 \`http://\` 或 \`https://\` 开头的绝对路径!`) } // 连接 `baseURL` 和 `url` let baseUrl = concatBaseURL(baseURL, url) // 去掉 `#` 后面的部分 baseUrl = baseUrl.split('#')[0] const [beforeQs, quertstring] = baseUrl.split('?') const params2 = decodeQs(quertstring || '') const query = Object.assign({}, params2, params) const wholeQs = encodeQs(query) return beforeQs + (wholeQs ? '?' + wholeQs : '') }