Files
npm-tool/.qoder/repowiki/zh/content/核心模块/HTTP 请求模块 (TsHttpUtil).md

726 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTTP 请求模块 (TsHttpUtil)
<cite>
**本文档引用的文件**
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [index.js](file://index.js)
- [package.json](file://package.json)
- [README.md](file://README.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
HTTP 请求模块 (TsHttpUtil) 是一个基于 umi-request 的网络请求封装库,提供了统一的 HTTP 请求接口,支持 GET、POST 和 FORM 请求方法。该模块集成了参数处理、错误处理、状态码映射、响应数据处理和加密传输等功能,为应用程序提供了一套完整的网络通信解决方案。
该模块的主要特点包括:
- 基于 umi-request 的现代化请求封装
- 智能的参数处理机制分页器转换、equals 条件处理)
- 统一的错误处理和状态码映射
- 可选的 SM4 加密传输支持
- 与存储模块、加密模块和配置模块的深度集成
## 项目结构
该项目采用模块化设计,将功能按职责划分为不同的模块:
```mermaid
graph TB
subgraph "核心模块"
Http[TsHttpUtil.js<br/>HTTP请求封装]
Crypto[TsCrypto.js<br/>加密模块]
SM4[TsSM4.js<br/>SM4算法实现]
end
subgraph "工具模块"
Common[TsCommon.js<br/>通用工具函数]
Storage[TsStorage.js<br/>存储模块]
Config[TsGlobalConfig.js<br/>全局配置]
end
subgraph "外部依赖"
UmiRequest[umi-request<br/>HTTP客户端]
Base64[base64-js<br/>Base64编码]
end
Http --> UmiRequest
Http --> Storage
Http --> Common
Http --> Crypto
Http --> Config
Crypto --> SM4
Crypto --> Base64
Crypto --> Config
SM4 --> Base64
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [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:19-22](file://package.json#L19-L22)
## 核心组件
### 主要导出接口
TsHttpUtil 模块提供了四个主要的 HTTP 请求方法:
1. **req()** - 通用请求方法,支持所有 HTTP 方法
2. **get()** - GET 请求方法
3. **post()** - POST 请求方法JSON 格式)
4. **form()** - 表单提交方法application/x-www-form-urlencoded
### 错误处理机制
模块内置了完善的错误处理系统:
```mermaid
flowchart TD
Request[发起请求] --> Response{收到响应}
Response --> |成功| CheckCode{状态码检查}
Response --> |失败| ErrorHandler[错误处理器]
CheckCode --> |200| ParseData[解析响应数据]
CheckCode --> |其他| HttpError[HTTP错误处理]
ParseData --> EncryptCheck{需要解密?}
EncryptCheck --> |是| Decrypt[解密数据]
EncryptCheck --> |否| ReturnData[返回数据]
Decrypt --> ReturnData
HttpError --> OnError[调用onHttpError回调]
OnError --> Reject[拒绝Promise]
ErrorHandler --> ReturnError[返回标准错误对象]
ReturnError --> Reject
```
**图表来源**
- [TsHttpUtil.js:25-35](file://src/https/TsHttpUtil.js#L25-L35)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
**章节来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
## 架构概览
### 整体架构设计
```mermaid
graph TB
subgraph "应用层"
Client[业务代码]
end
subgraph "HTTP层"
TsHttpUtil[TsHttpUtil]
Request[umi-request]
end
subgraph "数据处理层"
ParamsHandler[参数处理器]
ResponseHandler[响应处理器]
end
subgraph "安全层"
Crypto[加密模块]
Storage[存储模块]
end
subgraph "配置层"
GlobalConfig[全局配置]
SM4[SM4算法]
end
Client --> TsHttpUtil
TsHttpUtil --> Request
TsHttpUtil --> ParamsHandler
TsHttpUtil --> ResponseHandler
ParamsHandler --> Storage
ResponseHandler --> Crypto
Crypto --> SM4
TsHttpUtil --> GlobalConfig
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### 数据流处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as TsHttpUtil
participant ParamsHandler as 参数处理器
participant Crypto as 加密模块
participant Request as umi-request
participant Server as 服务器
Client->>HttpUtil : 发起请求
HttpUtil->>ParamsHandler : 处理参数
ParamsHandler->>ParamsHandler : 分页器转换
ParamsHandler->>ParamsHandler : equals条件处理
ParamsHandler->>ParamsHandler : 添加额外参数
alt 需要加密
ParamsHandler->>Crypto : 加密数据
Crypto->>Crypto : SM4加密
Crypto-->>ParamsHandler : 返回加密数据
end
ParamsHandler-->>HttpUtil : 返回处理后的参数
HttpUtil->>Request : 发送HTTP请求
Request->>Server : HTTP请求
Server-->>Request : HTTP响应
Request-->>HttpUtil : 响应数据
alt 响应需要解密
HttpUtil->>Crypto : 解密响应
Crypto->>Crypto : SM4解密
Crypto-->>HttpUtil : 返回明文数据
end
HttpUtil-->>Client : 返回处理后的数据
```
**图表来源**
- [TsHttpUtil.js:46-91](file://src/https/TsHttpUtil.js#L46-L91)
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
## 详细组件分析
### 参数处理机制
#### 分页器转换
模块支持智能的分页器参数转换:
| 输入参数 | 输出参数 |
|---------|---------|
| pagination.pageSize | pageSize |
| pagination.current | pageNum |
| pagination | 删除 |
#### equals 条件处理
equals 对象会被转换为逗号分隔的字符串:
```javascript
// 输入
{ equals: { id: 1, name: 'test' } }
// 输出
{ equals: "id=1,name=test" }
```
#### 额外参数添加
根据请求类型自动添加额外参数:
- **GET 请求**: 合并到 `params` 对象
- **POST 请求**: 合并到 `data` 对象
- **表单请求**: 合并到 `data` 对象
**章节来源**
- [TsHttpUtil.js:50-91](file://src/https/TsHttpUtil.js#L50-L91)
### 加密传输支持
#### 加密配置
加密功能通过全局配置启用:
```javascript
// 启用加密
TsGlobalConfig.setConfig({
encryptBody: true,
base64Key: "your-base64-key"
});
```
#### 加密流程
```mermaid
flowchart LR
Plain[明文数据] --> JSON[JSON序列化]
JSON --> SM4[SM4加密]
SM4 --> Base64[Base64编码]
Base64 --> Encrypted[加密数据]
Encrypted --> Send[发送到服务器]
Send --> Receive[接收响应]
Receive --> Decrypt[SM4解密]
Decrypt --> Parse[JSON解析]
Parse --> Plain
```
**图表来源**
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
- [TsSM4.js:338-387](file://src/utils/TsSM4.js#L338-L387)
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
### 错误处理策略
#### 状态码映射
模块内置了常用 HTTP 状态码的中文描述:
| 状态码 | 描述 |
|-------|------|
| 200 | 服务器成功返回请求的数据 |
| 201 | 新建或修改数据成功 |
| 202 | 一个请求已经进入后台排队(异步任务) |
| 204 | 删除数据成功 |
| 400 | 发出的请求有错误,服务器没有进行新建或修改数据的操作 |
| 401 | 用户没有权限(令牌、用户名、密码错误) |
| 403 | 用户得到授权,但是访问是被禁止的 |
| 404 | 发出的请求针对的是不存在的记录,服务器没有进行操作 |
| 406 | 请求的格式不可得 |
| 410 | 请求的资源被永久删除,且不会再得到的 |
| 422 | 当创建一个对象时,发生一个验证错误 |
| 500 | 服务器发生错误,请检查服务器 |
| 502 | 网关错误 |
| 503 | 服务不可用,服务器暂时过载或维护 |
| 504 | 网关超时 |
#### 错误处理流程
```mermaid
flowchart TD
Start[请求开始] --> TryRequest[尝试请求]
TryRequest --> Success{请求成功?}
Success --> |是| CheckStatus{状态码检查}
Success --> |否| NetworkError[网络错误处理]
CheckStatus --> Status200{状态码=200?}
Status200 --> |是| ParseResponse[解析响应]
Status200 --> |否| HttpError[HTTP错误处理]
ParseResponse --> EncryptCheck{需要解密?}
EncryptCheck --> |是| Decrypt[解密数据]
EncryptCheck --> |否| ReturnSuccess[返回成功结果]
Decrypt --> ReturnSuccess
HttpError --> CallCallback[调用onHttpError回调]
CallCallback --> ReturnError[返回错误对象]
NetworkError --> ReturnError
ReturnSuccess --> End[请求结束]
ReturnError --> End
```
**图表来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
- [TsHttpUtil.js:117-128](file://src/https/TsHttpUtil.js#L117-L128)
**章节来源**
- [TsHttpUtil.js:7-23](file://src/https/TsHttpUtil.js#L7-L23)
- [TsHttpUtil.js:28-35](file://src/https/TsHttpUtil.js#L28-L35)
### API 接口说明
#### get() 方法
**方法签名**
```javascript
async function get(url, params = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| params | object | 否 | {} | GET请求参数 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 基本使用
const result = await HttpUtil.get('/api/users');
// 带参数使用
const result = await HttpUtil.get('/api/users', {
page: 1,
size: 10,
name: '张三'
});
// 自定义选项
const result = await HttpUtil.get('/api/users', {}, {
timeout: 5000,
headers: {'Authorization': 'Bearer token'}
});
```
#### post() 方法
**方法签名**
```javascript
async function post(url, data = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| data | object | 否 | {} | POST请求数据 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 基本使用
const result = await HttpUtil.post('/api/users', {
name: '张三',
age: 25
});
// 表单数据
const result = await HttpUtil.post('/api/login', {
username: 'admin',
password: 'password'
}, {
requestType: 'form'
});
```
#### form() 方法
**方法签名**
```javascript
async function form(url, data = {}, options = {})
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| data | object | 否 | {} | 表单数据 |
| options | object | 否 | {} | 请求选项 |
**返回值**
```javascript
{
data: any, // 响应数据
recordsTotal: number // 总记录数
}
```
**使用示例**
```javascript
// 表单提交
const result = await HttpUtil.form('/api/upload', {
file: fileInput.files[0],
description: '文件描述'
});
```
#### req() 方法
**方法签名**
```javascript
async function req(url, options)
```
**参数说明**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| url | string | 是 | - | 请求的URL地址 |
| options | object | 是 | {} | 请求选项 |
**请求选项参数**
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|-------|------|------|--------|------|
| method | string | 否 | 'GET' | HTTP方法 |
| params | object | 否 | {} | GET参数 |
| data | object | 否 | {} | 请求数据 |
| requestType | string | 否 | 'json' | 请求类型 ('json' 或 'form') |
| headers | object | 否 | {} | 请求头 |
| rawResponse | boolean | 否 | false | 是否返回原始响应 |
**使用示例**
```javascript
// 自定义请求
const result = await HttpUtil.req('/api/data', {
method: 'POST',
data: {key: 'value'},
headers: {'Custom-Header': 'value'}
});
```
**章节来源**
- [TsHttpUtil.js:136-165](file://src/https/TsHttpUtil.js#L136-L165)
### 集成关系
#### 与存储模块的集成
TsHttpUtil 通过存储模块管理用户认证信息:
```mermaid
classDiagram
class TsHttpUtil {
+getUserToken() string
+saveUserToken(token) void
+getEncryptBody() boolean
+saveEncryptBody(bool) void
}
class TsStorage {
+getUserToken() string
+saveUserToken(token) void
+getEncryptBody() boolean
+saveEncryptBody(bool) void
}
class TsHttpUtil {
+headers : object
+token : string
}
TsHttpUtil --> TsStorage : 使用
```
**图表来源**
- [TsHttpUtil.js:109-111](file://src/https/TsHttpUtil.js#L109-L111)
- [TsStorage.js:13-23](file://src/utils/TsStorage.js#L13-L23)
#### 与加密模块的集成
加密功能通过 TsCrypto 和 TsSM4 实现:
```mermaid
classDiagram
class TsHttpUtil {
+encryptData(data) object
+decryptData(data) string
}
class TsCrypto {
+encrypt(content) string
+decrypt(base64) string
}
class TsSM4 {
+encrypt(plaintext) string
+decrypt(ciphertext) string
}
class TsGlobalConfig {
+base64Key : string
}
TsHttpUtil --> TsCrypto : 使用
TsCrypto --> TsSM4 : 使用
TsCrypto --> TsGlobalConfig : 读取配置
```
**图表来源**
- [TsHttpUtil.js:82-86](file://src/https/TsHttpUtil.js#L82-L86)
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
- [TsSM4.js:96-156](file://src/utils/TsSM4.js#L96-L156)
#### 与配置模块的集成
全局配置管理:
```mermaid
classDiagram
class TsGlobalConfig {
+defaultConfig : object
+getConfig() object
+setConfig(obj) void
}
class TsHttpUtil {
+prefix : string
+httpParams : function
+onHttpError : function
}
TsHttpUtil --> TsGlobalConfig : 读取配置
TsGlobalConfig --> TsHttpUtil : 提供配置
```
**图表来源**
- [TsGlobalConfig.js:5-29](file://src/utils/TsGlobalConfig.js#L5-L29)
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
**章节来源**
- [TsHttpUtil.js:100-106](file://src/https/TsHttpUtil.js#L100-L106)
- [TsGlobalConfig.js:19-29](file://src/utils/TsGlobalConfig.js#L19-L29)
## 依赖关系分析
### 外部依赖
项目的主要外部依赖包括:
| 依赖包 | 版本 | 用途 |
|-------|------|-----|
| umi-request | 1.4.0 | HTTP 客户端库 |
| base64-js | 1.5.1 | Base64 编码/解码 |
### 内部模块依赖
```mermaid
graph TD
TsHttpUtil[TsHttpUtil.js] --> TsStorage[TsStorage.js]
TsHttpUtil --> TsCommon[TsCommon.js]
TsHttpUtil --> TsCrypto[TsCrypto.js]
TsHttpUtil --> TsGlobalConfig[TsGlobalConfig.js]
TsCrypto --> TsSM4[TsSM4.js]
TsCrypto --> TsGlobalConfig
TsSM4 --> Base64[base64-js]
index[index.js] --> TsHttpUtil
index --> TsStorage
index --> TsCrypto
index --> TsGlobalConfig
index --> TsSM4
index --> TsCommon
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:19-22](file://package.json#L19-L22)
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 请求优化建议
1. **批量请求**: 对于多个相关的请求,考虑合并到单个请求中以减少网络开销
2. **缓存策略**: 在业务层实现适当的缓存机制,避免重复请求相同数据
3. **超时设置**: 合理设置请求超时时间,避免长时间阻塞
4. **压缩传输**: 对大体积数据考虑使用压缩算法
### 内存管理
- 及时清理不再使用的响应数据
- 避免在请求过程中创建大量临时对象
- 注意循环引用的处理
## 故障排除指南
### 常见问题及解决方案
#### 1. 认证失败
**症状**: 返回 401 状态码
**原因**: 用户令牌无效或过期
**解决方案**:
```javascript
// 检查用户令牌
const token = Storage.getUserToken();
if (!token) {
// 重新登录
redirectToLogin();
}
// 设置自定义头部
const result = await HttpUtil.get('/api/protected', {}, {
headers: {
'Authorization': `Bearer ${token}`
}
});
```
#### 2. 数据解密失败
**症状**: 解密后数据格式错误
**原因**: 加密密钥不匹配或数据损坏
**解决方案**:
```javascript
// 检查加密配置
const encryptEnabled = Storage.getEncryptBody();
if (encryptEnabled) {
// 验证密钥配置
const config = GlobalConfig.getConfig();
if (!config.base64Key) {
throw new Error('缺少加密密钥配置');
}
}
```
#### 3. 请求超时
**症状**: 请求长时间无响应
**原因**: 网络延迟或服务器负载过高
**解决方案**:
```javascript
try {
const result = await HttpUtil.get('/api/data', {}, {
timeout: 10000 // 10秒超时
});
} catch (error) {
if (error.code === 'ECONNABORTED') {
// 处理超时
showTimeoutMessage();
}
}
```
#### 4. 参数格式错误
**症状**: 返回 400 状态码
**原因**: 请求参数格式不符合服务器要求
**解决方案**:
```javascript
// 使用分页器参数
const result = await HttpUtil.get('/api/list', {
pagination: {
pageSize: 10,
current: 1
}
});
// 使用 equals 条件
const result = await HttpUtil.get('/api/search', {
equals: {
status: 'active',
type: 'user'
}
});
```
**章节来源**
- [TsHttpUtil.js:124-127](file://src/https/TsHttpUtil.js#L124-L127)
- [TsHttpUtil.js:130-132](file://src/https/TsHttpUtil.js#L130-L132)
## 结论
HTTP 请求模块 (TsHttpUtil) 提供了一个功能完整、易于使用的网络请求封装解决方案。其主要优势包括:
1. **统一的接口设计**: 提供简洁一致的 API 接口
2. **智能参数处理**: 自动处理分页器和条件参数
3. **完善的错误处理**: 内置状态码映射和错误回调机制
4. **灵活的安全支持**: 可选的 SM4 加密传输功能
5. **良好的模块化**: 与存储、加密、配置模块的深度集成
该模块适合在企业级应用中使用,能够有效简化网络请求的处理逻辑,提高开发效率和代码质量。通过合理的配置和使用,可以满足大多数 Web 应用的网络通信需求。