1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use HashMap;
use Method;
use crateAccessTokenType;
/// API请求的核心数据结构 - 命令模式的体现
///
/// `ApiRequest` 是整个SDK架构的核心,采用命令模式(Command Pattern)设计。
/// 它封装了发起一次飞书API调用所需的所有信息,充当服务层(Service)与传输层(Transport)之间的桥梁。
///
/// # 设计理念
///
/// - **解耦性**:服务层只负责构建请求,不关心HTTP细节
/// - **统一性**:所有API调用都通过这个统一的结构体表示
/// - **灵活性**:支持普通请求和multipart/form-data请求
///
/// # 使用流程
///
/// 1. 服务层方法创建并配置 `ApiRequest` 实例
/// 2. 设置HTTP方法、路径、认证需求等基本信息
/// 3. 根据请求类型填充 `body` 和/或 `file` 字段
/// 4. 将配置好的请求传递给 `Transport::request` 进行处理
///
/// # 示例
///
/// ```rust,ignore
/// // 普通JSON请求
/// let mut api_req = ApiRequest {
/// http_method: Method::POST,
/// api_path: "/open-apis/drive/v1/files".to_string(),
/// body: serde_json::to_vec(&request_data).unwrap(),
/// ..Default::default()
/// };
///
/// // 文件上传请求(multipart)
/// let mut api_req = ApiRequest {
/// http_method: Method::POST,
/// api_path: "/open-apis/drive/v1/files/upload".to_string(),
/// body: serde_json::to_vec(&metadata).unwrap(), // JSON元数据
/// file: file_bytes, // 文件内容
/// ..Default::default()
/// };
/// ```