# 网络请求问题
**本文引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与可靠性考虑](#性能与可靠性考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南聚焦于网络请求相关的故障排除,结合仓库中网络请求封装与工具模块,系统梳理常见 HTTP 错误(如 401/403、404、500、502、503、504)、跨域问题、请求超时、参数与 URL 前缀配置错误、Cookie 传递问题以及加解密与全局配置的影响因素。文档提供可落地的排查步骤、调试工具使用建议与日志分析流程,帮助快速定位与解决问题。
## 项目结构
该工具包以“网络请求封装 + 工具模块”为核心,对外通过统一入口导出,便于在业务层集中管理请求行为与全局配置。
```mermaid
graph TB
A["index.js
统一导出"] --> B["src/https/TsHttpUtil.js
请求封装与错误处理"]
A --> C["src/utils/TsGlobalConfig.js
全局配置"]
A --> D["src/utils/TsStorage.js
本地存储与Token/Cookie相关"]
A --> E["src/utils/TsCommon.js
通用工具"]
A --> F["src/utils/TsCrypto.js
加密/解密"]
F --> G["src/utils/TsSM4.js
SM4实现"]
```
图表来源
- [index.js:1-16](file://index.js#L1-L16)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
章节来源
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
- 请求封装与错误处理:基于 umi-request 的扩展,统一设置默认参数(携带 Cookie、JSON 请求体),内置错误映射与兜底处理。
- 全局配置:提供前缀、额外参数注入、HTTP 错误回调等可插拔配置项。
- 存储与 Token:负责用户 Token 的读取与持久化,以及是否启用请求体加密的开关。
- 加密模块:基于 SM4 的加解密实现,支持 ECB 模式与 Base64 输出。
- 通用工具:空值判断、JSON 解析、URL 参数解析等基础能力。
章节来源
- [TsHttpUtil.js:7-35](file://src/https/TsHttpUtil.js#L7-L35)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsCommon.js:25-44](file://src/utils/TsCommon.js#L25-L44)
## 架构总览
下图展示从调用方到网络层的关键交互路径,以及错误处理与加解密的插入点。
```mermaid
sequenceDiagram
participant Caller as "调用方"
participant Http as "TsHttpUtil.req"
participant Conf as "TsGlobalConfig"
participant Store as "TsStorage"
participant Crypto as "TsCrypto"
participant Umi as "umi-request"
participant Srv as "后端服务"
Caller->>Http : "发起请求(get/post/form)"
Http->>Conf : "读取全局配置(prefix/httpParams/onHttpError)"
Http->>Store : "读取用户Token"
Http->>Http : "组装参数/附加额外参数/可选加密"
Http->>Umi : "执行请求(携带Cookie/JSON)"
Umi-->>Http : "响应/错误"
Http->>Crypto : "若响应标记加密则解密"
Http-->>Caller : "返回标准化结果或抛出错误"
Http->>Conf : "非200时触发onHttpError(res)"
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- [TsCrypto.js:19-30](file://src/utils/TsCrypto.js#L19-L30)
## 详细组件分析
### 请求封装与错误处理(TsHttpUtil)
- 默认行为
- 默认携带 Cookie(credentials: include),确保跨子域与第三方 Cookie 场景可用。
- 默认 JSON 请求体(requestType: json),POST 表单需显式选择 form。
- 统一错误处理:将响应状态映射为可读消息,未捕获时兜底为“参数错误或服务器异常”。
- 参数处理
- 支持分页参数转换(pagination -> pageNum/pageSize)。
- 支持 equals 对象转逗号分隔字符串。
- 支持全局额外参数注入(GET 合并 params;非表单 POST 合并 data)。
- 可选请求体加密:当开启 encrypt_body 时,将 data 包装为 encryptData 并加密。
- URL 前缀
- prefix 支持字符串或函数,函数形式可按 URL 动态决定前缀,避免硬编码。
- 响应处理
- 当 rawResponse 为真时直接返回原始响应;否则仅返回 data 与 recordsTotal。
- 若响应标记加密,自动解密并解析 JSON。
- 非 200 时触发 onHttpError 回调,同时 reject 标准化错误对象。
```mermaid
flowchart TD
Start(["进入 req"]) --> Prefix["读取全局配置prefix"]
Prefix --> HasPrefix{"prefix存在?"}
HasPrefix --> |是| Join["拼接url = prefix + url"]
HasPrefix --> |否| Skip["保持原url"]
Join --> Params["dealParamsBody处理参数/附加额外参数/可选加密"]
Skip --> Params
Params --> Headers["合并headers并注入用户Token"]
Headers --> Send["umi-request发送请求"]
Send --> Resp{"rawResponse?"}
Resp --> |是| ReturnRaw["返回原始响应"]
Resp --> |否| Code{"响应码=200?"}
Code --> |是| Decrypt{"响应标记加密?"}
Decrypt --> |是| Dec["解密+JSON解析"] --> ReturnData["返回{data,recordsTotal}"]
Decrypt --> |否| ReturnData
Code --> |否| Hook["触发onHttpError(res)"] --> Reject["reject标准化错误"]
```
图表来源
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
章节来源
- [TsHttpUtil.js:7-35](file://src/https/TsHttpUtil.js#L7-L35)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
### 全局配置(TsGlobalConfig)
- 关键配置项
- base64Key:用于初始化加密模块的密钥缓冲区。
- prefix:统一请求前缀,支持函数按 URL 动态生成。
- onHttpError:非 200 时的回调钩子,便于统一处理错误。
- httpParams:返回额外参数对象,GET 合并到 params,POST 合并到 data。
- 读写方式
- 通过 window.httpConfig 注入全局配置,setConfig 支持增量合并。
章节来源
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
### 存储与 Token(TsStorage)
- 用户 Token
- 读取:getUserToken 从本地存储获取,为空时返回空字符串。
- 写入:saveUserToken 将 Token 持久化。
- 请求体加密开关
- getEncryptBody/getSaveEncryptBody 控制是否对请求体进行加密包装。
- Cookie 传递
- 默认 credentials: include,配合后端 SameSite/Cross-Origin 策略使用。
章节来源
- [TsStorage.js:9-23](file://src/utils/TsStorage.js#L9-L23)
### 加密模块(TsCrypto 与 TsSM4)
- 初始化
- 使用 base64Key 生成 16 字节密钥缓冲区,构造 SM4 实例。
- 加密/解密
- encrypt:对明文进行 SM4 加密(ECB 模式,Base64 输出)。
- decrypt:对密文进行 SM4 解密。
- 注意事项
- ECB 模式无 IV,适合小块数据;CBC 需要 IV,当前实现未使用 IV。
- cipherType 默认 Base64,与前端期望一致。
章节来源
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
- [TsSM4.js:395-452](file://src/utils/TsSM4.js#L395-L452)
## 依赖关系分析
- TsHttpUtil 依赖
- TsGlobalConfig:读取 prefix、httpParams、onHttpError。
- TsStorage:读取用户 Token、加密开关。
- TsCrypto:在开启加密时对请求体进行加密。
- TsCommon:参数处理与空值判断。
- TsCrypto 依赖
- TsGlobalConfig:读取 base64Key。
- TsSM4:SM4 算法实现。
- 外部依赖
- umi-request:HTTP 请求库。
- base64-js:Base64 编解码。
```mermaid
graph LR
Http["TsHttpUtil"] --> Conf["TsGlobalConfig"]
Http --> Store["TsStorage"]
Http --> Crypto["TsCrypto"]
Http --> Common["TsCommon"]
Crypto --> SM4["TsSM4"]
Http --> Umi["umi-request"]
Crypto --> Base64["base64-js"]
```
图表来源
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsCrypto.js:1-4](file://src/utils/TsCrypto.js#L1-L4)
- [package.json:19-22](file://package.json#L19-L22)
章节来源
- [TsHttpUtil.js:1-6](file://src/https/TsHttpUtil.js#L1-L6)
- [TsCrypto.js:1-4](file://src/utils/TsCrypto.js#L1-L4)
- [package.json:19-22](file://package.json#L19-L22)
## 性能与可靠性考虑
- 请求并发与重试
- 当前未内置重试机制,建议在上层业务根据错误类型(如 502/503/504)进行指数退避重试。
- 超时控制
- 可通过 umi-request 的 timeout 配置项在扩展层增加超时控制,避免长时间阻塞。
- 日志与监控
- 在 onHttpError 中接入埋点或上报,记录状态码、URL、耗时、Token 状态等,便于后续分析。
- 加密开销
- 对大体量请求体加密会带来 CPU 开销,建议仅对敏感数据启用加密。
[本节为通用建议,不直接分析具体文件]
## 故障排除指南
### 一、常见 HTTP 错误与处理策略
- 200 成功
- 正常流程,无需处理。
- 201/202/204
- 业务状态正常,关注业务语义与后续处理。
- 400 客户端参数错误
- 排查请求体格式、必填字段、分页参数转换逻辑(pageNum/pageSize)。
- 401 未认证/令牌无效
- 检查 Token 是否存在、是否过期、是否正确写入存储。
- 确认请求头是否注入了 Token。
- 403 权限不足
- 检查用户角色与接口权限,确认 Token 有效但无访问权限。
- 404 资源不存在
- 检查 URL 是否正确、前缀是否匹配、路径参数是否缺失。
- 406/410/422
- 406:请求格式不可得;410:资源永久删除;422:创建对象时验证错误。
- 500 服务器内部错误
- 记录请求上下文,联系后端排查。
- 502/503/504 网关/服务不可用/网关超时
- 建议重试与降级策略,必要时提示用户稍后再试。
章节来源
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### 二、跨域请求失败排查
- 关键点
- 浏览器同源策略限制,需后端设置正确的 Access-Control-Allow-*。
- 若携带 Cookie,需确保:
- credentials: include 生效(默认已开启)。
- 后端允许 Credentials(Access-Control-Allow-Credentials: true)。
- 前端指定具体 Origin(而非通配符),后端允许该 Origin。
- 建议
- 使用浏览器开发者工具 Network 面板查看预检请求与响应头。
- 确认域名、协议、端口一致或后端明确放行。
章节来源
- [TsHttpUtil.js:42](file://src/https/TsHttpUtil.js#L42)
### 三、请求超时
- 现状
- 当前未设置超时时间,可能出现长时间等待。
- 建议
- 在扩展层增加 timeout 配置,或在上层业务做超时控制。
- 对长耗时接口采用分页/分批策略。
[本节为通用建议,不直接分析具体文件]
### 四、401/403 权限错误
- 常见原因
- Token 不存在或为空。
- Token 过期或被撤销。
- 请求头未注入 Token。
- 排查步骤
- 检查存储中是否存在 Token。
- 确认请求头是否包含 Token。
- 若后端要求特定头名,需在上层统一注入。
- 处理策略
- 401:跳转登录或刷新 Token。
- 403:提示权限不足或引导用户联系管理员。
章节来源
- [TsStorage.js:13-15](file://src/utils/TsStorage.js#L13-L15)
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
### 五、500 服务器错误
- 建议
- 记录完整请求上下文(URL、params/data、headers、Token)。
- 在 onHttpError 中接入日志上报,便于后端定位。
- 必要时进行降级或重试。
章节来源
- [TsHttpUtil.js:125](file://src/https/TsHttpUtil.js#L125)
### 六、请求参数配置问题
- 分页参数
- pagination 转换为 pageNum/pageSize,确认传入对象结构正确。
- equals 对象
- equals 对象中空值会被过滤,确保非空字段参与拼接。
- 全局额外参数
- httpParams 返回的对象会合并到 GET params 或 POST data,注意字段冲突与覆盖顺序。
章节来源
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
- [TsGlobalConfig.js:10-12](file://src/utils/TsGlobalConfig.js#L10-L12)
### 七、URL 前缀配置错误
- 现状
- prefix 支持字符串或函数;函数形式可按 URL 动态生成。
- 排查
- 确认 prefix 是否为空或返回空字符串。
- 函数形式需保证返回值为合法前缀(含协议与结尾斜杠)。
- 建议
- 在开发环境与生产环境分别设置不同前缀,避免硬编码。
章节来源
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsGlobalConfig.js:7](file://src/utils/TsGlobalConfig.js#L7)
### 八、Cookie 传递问题
- 现状
- 默认携带 Cookie(credentials: include),适用于同源与跨子域场景。
- 排查
- 确认后端是否正确设置 Domain/SameSite/Cross-Origin。
- 若跨域,需后端允许 Credentials 且指定具体 Origin。
- 建议
- 在上层统一设置 Cookie 与 Token,避免遗漏。
章节来源
- [TsHttpUtil.js:42](file://src/https/TsHttpUtil.js#L42)
### 九、加解密相关问题
- 现状
- 当开启 encrypt_body 时,请求体被包装为 encryptData 并加密;响应若标记加密则自动解密。
- 排查
- 确认 base64Key 与后端一致。
- 确认加密模式(ECB)与后端一致。
- 确认 cipherType 为 Base64。
- 建议
- 仅对敏感字段启用加密,避免大体积数据加密带来的性能损耗。
章节来源
- [TsStorage.js:17-23](file://src/utils/TsStorage.js#L17-L23)
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsHttpUtil.js:119-122](file://src/https/TsHttpUtil.js#L119-L122)
- [TsCrypto.js:8-13](file://src/utils/TsCrypto.js#L8-L13)
- [TsSM4.js:128-141](file://src/utils/TsSM4.js#L128-L141)
### 十、调试工具与监控技巧
- 浏览器开发者工具
- Network:查看请求头、响应头、CORS、Cookie、状态码与耗时。
- Console:输出 onHttpError 回调中的错误信息。
- 日志与上报
- 在 onHttpError 中记录:URL、状态码、请求体摘要、Token 状态、时间戳。
- 对 5xx 错误进行聚合统计,辅助定位热点接口。
- 本地与线上差异
- 使用不同 prefix 区分开发/测试/生产环境。
- 在开发环境开启更详细的日志与断言。
章节来源
- [TsHttpUtil.js:125](file://src/https/TsHttpUtil.js#L125)
- [TsGlobalConfig.js:7](file://src/utils/TsGlobalConfig.js#L7)
### 十一、错误日志分析与问题定位流程
- 步骤
- 收集:URL、状态码、请求头、请求体、响应体、时间戳、Token 状态。
- 分类:4xx(参数/权限/资源)、5xx(服务/网关)、CORS/超时。
- 定位:依据状态码与日志,缩小范围至前端配置、Cookie/Token、加解密、后端接口。
- 复现:构造最小复现场景,逐步剔除变量(关闭加密、更换 prefix、清除 Cookie)。
- 验证:修复后回归测试,观察 onHttpError 是否仍触发。
- 建议
- 对高频错误建立告警阈值,结合用户反馈与日志进行联动。
[本节为通用建议,不直接分析具体文件]
## 结论
本工具包通过统一的请求封装、全局配置与加解密模块,提供了较为完善的网络请求基础设施。结合本文提供的故障排除清单与定位流程,可在大多数情况下快速识别并解决常见的网络请求问题。建议在生产环境中补充超时控制、重试与监控上报机制,持续优化用户体验与稳定性。
[本节为总结性内容,不直接分析具体文件]
## 附录
### A. 常见错误代码速查
- 200:成功
- 201:新建/修改成功
- 202:请求已进入后台排队
- 204:删除成功
- 400:请求参数错误
- 401:未认证/令牌无效
- 403:权限不足
- 404:资源不存在
- 406:请求格式不可得
- 410:资源永久删除
- 422:创建对象时验证错误
- 500:服务器内部错误
- 502:网关错误
- 503:服务不可用/过载
- 504:网关超时
章节来源
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
### B. 关键配置与默认值
- 默认配置
- base64Key:默认密钥(用于加密模块初始化)。
- prefix:默认空字符串。
- onHttpError:默认空函数。
- httpParams:默认空函数。
- 请求默认
- credentials: include(携带 Cookie)。
- requestType: json(POST JSON)。
- 默认错误处理:将状态映射为可读消息。
章节来源
- [TsGlobalConfig.js:5-13](file://src/utils/TsGlobalConfig.js#L5-L13)
- [TsHttpUtil.js:40-44](file://src/https/TsHttpUtil.js#L40-L44)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### C. 使用示例参考
- README 提供了基本使用方式与全局配置示例,可据此进行最小复现与验证。
章节来源
- [README.md:12-26](file://README.md#L12-L26)