axios能否将自定义URL Scheme设为baseURL?如何解决双斜杠替换问题
问题根源
axios拼接URL时会调用运行环境内置的标准URL解析逻辑,而浏览器、Node.js等环境的URL实现仅会将http、https、ftp等内置的层级型协议识别为合法层级scheme,自定义scheme会被判定为非层级协议,自动移除协议名后的双斜杠,最终得到my-custom-scheme:/some-other/endpoint的错误地址。
最优解决方案
直接绕开axios内置的URL拼接逻辑,通过请求拦截器手动拼接自定义scheme地址,该方案不依赖axios内部实现,全版本兼容,代码如下:
const axiosInstance = axios.create({ // 不要在baseURL字段传入自定义scheme,避免触发内置URL解析逻辑 baseURL: '' }) // 请求拦截器中手动拼接完整目标地址 axiosInstance.interceptors.request.use(config => { const CUSTOM_SCHEME = 'my-custom-scheme://' // 统一规整路径开头的斜杠,避免出现斜杠重复或缺失 const path = config.url.startsWith('/') ? config.url.slice(1) : config.url config.url = `${CUSTOM_SCHEME}${path}` return config }) // 正常调用即可,最终请求地址符合预期:my-custom-scheme://some-other/endpoint axiosInstance({ method: 'GET', // 注意原示例代码中写的methods是参数笔误,正确参数为单数method url: '/some-other/endpoint' })
不推荐的方案说明
- 不要通过改写axios内部
combineURLs方法、在baseURL中加特殊占位符再替换的方式实现:这类方案强依赖axios的内部源码逻辑,axios版本迭代后很容易失效。 - 宿主环境注册自定义scheme的方案仅适用于Electron、App内嵌WebView等可控环境,通用性差,不适合通用业务场景使用。
内容的提问来源于stack exchange,提问作者zetdotcom
相关产品推荐
相关产品推荐

