# HTTP 请求封装对比 ## 当前实现 vs JeecgBoot ### ✅ 已实现的核心功能 | 功能 | JeecgBoot | 当前实现 | 说明 | |------|-----------|----------|------| | 请求拦截 | ✅ | ✅ | 添加通用请求头、处理参数 | | 响应拦截 | ✅ | ✅ | 统一处理响应数据 | | 错误处理 | ✅ | ✅ | HTTP 状态码错误提示 | | 超时控制 | ✅ | ✅ | 默认 30 秒超时 | | Cookie 认证 | ❌ | ✅ | 使用 Cookie 而非 Token | | GET 防缓存 | ✅ | ✅ | 自动添加时间戳 | | API 前缀 | ✅ | ✅ | 统一添加 `/sohoyw-som` | | 消息提示 | ✅ | ✅ | 使用 Notification 组件 | ### 🔄 可选增强功能 以下是 JeecgBoot 中的高级功能,可根据需要添加: #### 1. 请求签名(MD5) ```typescript // JeecgBoot 实现 config.headers[ConfigEnum.TIMESTAMP] = signMd5Utils.getTimestamp(); config.headers[ConfigEnum.Sign] = signMd5Utils.getSign(config.url, config.params, config.data); ``` **是否需要:** 取决于后端是否要求签名验证 #### 2. 多租户支持 ```typescript // JeecgBoot 实现 config.headers[ConfigEnum.TENANT_ID] = tenantId; ``` **是否需要:** 如果系统支持多租户,需要添加 #### 3. 请求取消(防重复) ```typescript // JeecgBoot 使用 axios 的 CancelToken // 当前可以使用 AbortController 实现 ``` **是否需要:** 防止用户快速点击导致重复请求 #### 4. 流式数据支持 ```typescript // JeecgBoot 支持 SSE 流式响应 config.responseType = 'stream'; ``` **是否需要:** 如果有 AI 对话等流式场景 #### 5. 文件下载增强 ```typescript // JeecgBoot 支持下载进度、文件名提取等 ``` **是否需要:** 如果有大文件下载需求 #### 6. 请求重试 ```typescript // 失败后自动重试 retryCount: 3, retryDelay: 1000 ``` **是否需要:** 提高网络不稳定时的成功率 #### 7. 请求日志 ```typescript // 记录所有请求到 errorLog store errorLogStore.addAjaxErrorInfo(error); ``` **是否需要:** 用于问题排查和监控 ## 建议 ### 当前实现已足够的场景 - ✅ 标准的 CRUD 操作 - ✅ 基于 Cookie 的认证 - ✅ 简单的错误提示 - ✅ 文件上传下载 ### 需要增强的场景 - ❌ 需要请求签名验证 - ❌ 多租户系统 - ❌ 需要防止重复请求 - ❌ 有流式数据需求 - ❌ 需要详细的请求日志 ## 快速增强方案 如果需要添加某个功能,可以参考以下步骤: ### 1. 添加请求签名 ```typescript // src/utils/sign.ts export function generateSign(url: string, params: any, data: any): string { // 实现签名逻辑 } // src/utils/request.ts config.headers['X-Sign'] = generateSign(url, params, data); config.headers['X-Timestamp'] = Date.now(); ``` ### 2. 添加多租户 ```typescript // src/utils/request.ts const tenantId = getTenantId(); // 从 localStorage 或 context 获取 config.headers['X-Tenant-ID'] = tenantId; ``` ### 3. 添加请求取消 ```typescript // src/utils/request.ts const pendingRequests = new Map(); // 在请求前检查并取消重复请求 const requestKey = `${method}:${url}`; if (pendingRequests.has(requestKey)) { pendingRequests.get(requestKey)?.abort(); } ``` ## 总结 当前的 `request.ts` 实现已经覆盖了大部分常用场景,代码简洁易维护。 **建议:** 1. 先使用当前实现 2. 根据实际需求逐步添加功能 3. 避免过度设计,保持代码简洁 如果后端明确要求某些功能(如签名、租户ID),再添加对应的实现。