Files
ccdi/form-data修复说明.md

146 lines
3.9 KiB
Markdown
Raw Normal View History

# 📋 Form-Data 修复说明
## 修复日期
2026-03-03
## 问题描述
原代码中使用 JSON body 方式传输参数,但接口文档要求使用 form-data (application/x-www-form-urlencoded) 方式传输。
## 修复内容
### 1. 修改接口参数接收方式
将所有接口从 `json=` 改为 `data=``Form=`
**修改的文件:**
- `routers/api.py` - 所有接口改为使用 Form 参数
- `models/request.py` - 更新请求模型
- `tests/` - 所有测试代码更新为使用 data 参数
- `README.md` - 更新示例代码
### 2. 修改的接口
#### 接口1: 获取Token
- **修改前**: 使用 `json=GetTokenRequest` 接收 JSON body
- **修改后**: 使用 Form 参数分别接收每个字段
```python
# 修改前
async def get_token(request: GetTokenRequest):
...
# 修改后
async def get_token(
projectNo: str = Form(...),
entityName: str = Form(...),
userId: str = Form(...),
# ... 其他参数
):
# 构建请求对象
request = GetTokenRequest(...)
...
```
#### 接口3: 拉取行内流水
- **修改前**: 使用 `json=FetchInnerFlowRequest`
- **修改后**: 使用 Form 参数
#### 接口4: 检查解析状态
- **修改前**: 使用 `json=CheckParseStatusRequest`
- **修改后**: 使用 Form 参数
#### 接口5: 删除文件
- **修改前**: 使用 `json=DeleteFilesRequest`
- **修改后**: 使用 Form 参数
- **特殊处理**: `logIds` 从数组改为逗号分隔的字符串
```python
# 前端传递: logIds=10001,10002,10003
# 后端处理:
log_id_list = [int(id.strip()) for id in logIds.split(",")]
```
#### 接口6: 获取银行流水
- **修改前**: 使用 `json=GetBankStatementRequest`
- **修改后**: 使用 Form 参数
### 3. 测试代码更新
所有测试从 `json=` 改为 `data=`
```python
# 修改前
response = client.post("/account/common/getToken", json=request_data)
# 修改后
response = client.post("/account/common/getToken", data=request_data)
```
### 4. 文档更新
README.md 中的示例代码更新为使用 `data=` 参数:
```python
# 修改前
json={
"projectNo": "test_project_001",
...
}
# 修改后
data={
"projectNo": "test_project_001",
...
}
```
## 测试结果
**所有测试通过 (7/7)**
```bash
======================== 7 passed, 1 warning in 0.08s =========================
```
## 使用示例
### curl 请求
```bash
# 使用 form-data 方式
curl -X POST http://localhost:8000/account/common/getToken \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "projectNo=test_project_001" \
-d "entityName=测试企业" \
-d "userId=902001" \
-d "userName=902001" \
-d "appId=remote_app" \
-d "appSecretCode=your_secret_code" \
-d "role=VIEWER" \
-d "orgCode=902000" \
-d "departmentCode=902000"
```
### Python requests 请求
```python
# 使用 form-data 方式
response = requests.post(
"http://localhost:8000/account/common/getToken",
data={
"projectNo": "test_project_001",
"entityName": "测试企业",
"userId": "902001",
"userName": "902001",
"appId": "remote_app",
"appSecretCode": "your_secret_code",
"role": "VIEWER",
"orgCode": "902000",
"departmentCode": "902000"
}
)
```
## 注意事项
1. **Content-Type**: 所有接口现在使用 `application/x-www-form-urlencoded`
2. **数组参数**: 如 `logIds` 需要传递逗号分隔的字符串,如: `"10001,10002,10003"`
3. **可选参数**: 可选参数可以不传或传空值
4. **测试验证**: 所有 7 个测试用例全部通过
## 影响范围
- ✅ 不向后兼容
- ⚠️ 所有调用这些接口的客户端需要更新为使用 form-data 方式
- ⚠️ Swagger UI 会自动显示正确的参数格式
## 修复验证
- [x] 修改所有接口使用 Form 参数
- [x] 更新所有测试代码
- [x] 运行测试通过 (7/7)
- [x] 创建修复文档
## 修复状态
**已完成** - 所有接口已改为 form-data 方式,测试全部通过