柯里化实现网络请求头自动注入是通过高阶函数将固定配置(如token、版本号)预置进请求函数,生成可复用、无框架依赖、逻辑透明的定制化fetch函数,兼容原生环境且支持动态扩展。

用柯里化实现网络请求头自动注入,本质是把“固定配置”(如 token、环境标识、版本号)提前固化进请求函数,生成一个可复用、可组合、不污染业务调用的定制化请求函数。
为什么柯里化比直接写拦截器更合适?
不是所有项目都用 axios;原生 fetch 没有内置拦截器。柯里化提供了一种轻量、无框架依赖、逻辑透明的方案:
- 避免每次请求都手动拼接 headers 对象
- 防止因重复创建匿名函数导致 removeEventListener 失效(虽此处不涉及事件,但同理:柯里化函数可被稳定引用、复用、测试)
- 天然支持多环境切换——只需换一个柯里化后的函数,无需改业务代码
基础柯里化请求函数(fetch 版)
封装一个高阶函数,接收配置对象,返回带预置头的 fetch 函数:
复制即可用,兼容主流浏览器
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const createRequest = (config = {}) => {<br> const { baseURL = '', headers: defaultHeaders = {}, timeout = 10000 } = config;<br> return async (url, options = {}) => {<br> const controller = new AbortController();<br> const id = setTimeout(() => controller.abort(), timeout);<br> try {<br> const fullUrl = baseURL + url;<br> const headers = { ...defaultHeaders, ...options.headers };<br> const res = await fetch(fullUrl, {<br> ...options,<br> headers,<br> signal: controller.signal<br> });<br> clearTimeout(id);<br> return res;<br> } catch (err) {<br> clearTimeout(id);<br> if (err.name === 'AbortError') throw new Error('Request timeout');<br> throw err;<br> }<br> };<br>};
注入 Token 和业务头的实际用法
从 localStorage 读 token,并与版本号、来源等一起注入:
// 1. 创建带默认头的请求函数<br>const request = createRequest({<br> baseURL: '/api',<br> headers: {<br> 'X-Client-Version': '2.3.0',<br> 'X-Source': 'web'<br> }<br>});<br><br>// 2. 封装带认证的版本(柯里化第二层)<br>const authRequest = (token) => {<br> return (url, options = {}) => {<br> const headers = {<br> ...options.headers,<br> 'Authorization': `Bearer ${token}`<br> };<br> return request(url, { ...options, headers });<br> };<br>};<br><br>// 3. 使用时按需注入 token(例如登录后)<br>const api = authRequest(localStorage.getItem('token'));<br>api('/user/profile').then(r => r.json()).then(console.log);
进阶:支持动态 header 补充(如 traceId)
某些场景需要每次请求生成唯一 traceId。可在柯里化链中加入中间层:
const withTraceId = (requestFn) => {<br> return (url, options = {}) => {<br> const traceId = 'tr-' + Date.now() + '-' + Math.random().toString(36).substr(2, 9);<br> const headers = {<br> ...options.headers,<br> 'X-Trace-ID': traceId<br> };<br> return requestFn(url, { ...options, headers });<br> };<br>};<br><br>// 组合使用<br>const finalApi = withTraceId(api); // api 已含 token<br>finalApi('/order/list');Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










