242 lines
6.7 KiB
Markdown
242 lines
6.7 KiB
Markdown
|
|
# ✅ Form-Data 修复完成报告
|
|||
|
|
|
|||
|
|
## 修复日期
|
|||
|
|
2026-03-03
|
|||
|
|
## 修复人员
|
|||
|
|
Claude Code
|
|||
|
|
## 修复状态
|
|||
|
|
✅ **已完成** - 所有接口已改为 form-data 方式,测试全部通过
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 问题说明
|
|||
|
|
|
|||
|
|
用户指出:**接口参数应该通过 form-data 进行传输**
|
|||
|
|
|
|||
|
|
原代码使用 JSON body (`json=`) 方式传输参数,但接口文档要求使用 **form-data** (`application/x-www-form-urlencoded`) 方式传输。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 修复内容
|
|||
|
|
|
|||
|
|
### 1. 修改接口参数接收方式
|
|||
|
|
|
|||
|
|
将所有接口从 `json=` 改为使用 FastAPI 的 `Form` 参数
|
|||
|
|
|
|||
|
|
#### 修改前:
|
|||
|
|
```python
|
|||
|
|
@router.post("/account/common/getToken")
|
|||
|
|
async def get_token(request: GetTokenRequest):
|
|||
|
|
# 接收 JSON body
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改后:
|
|||
|
|
```python
|
|||
|
|
@router.post("/account/common/getToken")
|
|||
|
|
async def get_token(
|
|||
|
|
projectNo: str = Form(..., description="项目编号"),
|
|||
|
|
entityName: str = Form(..., description="项目名称"),
|
|||
|
|
userId: str = Form(..., description="操作人员编号"),
|
|||
|
|
# ... 其他参数
|
|||
|
|
):
|
|||
|
|
# 构建请求对象
|
|||
|
|
request = GetTokenRequest(
|
|||
|
|
projectNo=projectNo,
|
|||
|
|
entityName=entityName,
|
|||
|
|
...
|
|||
|
|
)
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 修改的接口列表
|
|||
|
|
|
|||
|
|
| 接口 | 路径 | 修改内容 |
|
|||
|
|
|------|------|---------|
|
|||
|
|
| 1 | `/account/common/getToken` | ✅ 15个 Form 参数 |
|
|||
|
|
| 2 | `/watson/api/project/remoteUploadSplitFile` | ✅ 已使用 Form,| 3 | `/watson/api/project/getJZFileOrZjrcuFile` | ✅ 7个 Form 参数 |
|
|||
|
|
| 4 | `/watson/api/project/upload/getpendings` | ✅ 2个 Form 参数 |
|
|||
|
|
| 5 | `/watson/api/project/batchDeleteUploadFile` | ✅ 3个 Form 参数 |
|
|||
|
|
| 6 | `/watson/api/project/getBSByLogId` | ✅ 4个 Form 参数 |
|
|||
|
|
|
|||
|
|
### 3. 修改的文件
|
|||
|
|
|
|||
|
|
#### 核心代码
|
|||
|
|
1. **routers/api.py** - 所有接口改为使用 Form 参数
|
|||
|
|
- 接口1: 15个 Form 参数
|
|||
|
|
- 接口3: 7个 Form 参数
|
|||
|
|
- 接口4: 2个 Form 参数
|
|||
|
|
- 接口5: 3个 Form 参数(支持逗号分隔的字符串)
|
|||
|
|
- 接口6: 4个 Form 参数
|
|||
|
|
|
|||
|
|
#### 测试代码
|
|||
|
|
2. **tests/conftest.py** - 更新测试 fixture
|
|||
|
|
3. **tests/test_api.py** - 更新单元测试
|
|||
|
|
- 将 `json=` 改为 `data=`
|
|||
|
|
4. **tests/integration/test_full_workflow.py** - 更新集成测试
|
|||
|
|
- 将所有 `json=` 改为 `data=`
|
|||
|
|
|
|||
|
|
#### 文档
|
|||
|
|
5. **README.md** - 更新使用示例
|
|||
|
|
- 将示例代码改为使用 `data=` 参数
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 测试结果
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
============================= test session starts =============================
|
|||
|
|
platform win32 -- Python 3.13.12, pytest-9.0.2, pluggy-1.6.0
|
|||
|
|
rootdir: D:\ccdi\ccdi\.claude\worktrees\lsfx-mock-server\lsfx-mock-server
|
|||
|
|
plugins: anyio-4.12.1, cov-7.0.0
|
|||
|
|
collected 7 items
|
|||
|
|
|
|||
|
|
tests/integration/test_full_workflow.py::test_complete_workflow PASSED [ 14%]
|
|||
|
|
tests/integration/test_full_workflow.py::test_all_error_codes PASSED [ 28%]
|
|||
|
|
tests/integration/test_full_workflow.py::test_pagination PASSED [ 42%]
|
|||
|
|
tests/test_api.py::test_root_endpoint PASSED [ 57%]
|
|||
|
|
tests/test_api.py::test_health_check PASSED [ 71%]
|
|||
|
|
tests/test_api.py::test_get_token_success PASSED [ 85%]
|
|||
|
|
tests/test_api.py::test_get_token_error_40101 PASSED [100%]
|
|||
|
|
|
|||
|
|
======================== 7 passed, 1 warning in 0.08s =========================
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**结论**: ✅ **所有 7 个测试用例通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📖 使用示例
|
|||
|
|
|
|||
|
|
### Python requests
|
|||
|
|
```python
|
|||
|
|
import requests
|
|||
|
|
|
|||
|
|
# ✅ 正确方式:使用 data 参数
|
|||
|
|
response = requests.post(
|
|||
|
|
"http://localhost:8000/account/common/getToken",
|
|||
|
|
data={ # 使用 data 参数,不是 json
|
|||
|
|
"projectNo": "test_project_001",
|
|||
|
|
"entityName": "测试企业",
|
|||
|
|
"userId": "902001",
|
|||
|
|
"userName": "902001",
|
|||
|
|
"appId": "remote_app",
|
|||
|
|
"appSecretCode": "your_secret_code",
|
|||
|
|
"role": "VIEWER",
|
|||
|
|
"orgCode": "902000",
|
|||
|
|
"departmentCode": "902000"
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 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"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Swagger UI
|
|||
|
|
访问 http://localhost:8000/docs,Swagger UI 会自动显示正确的参数格式(form-data)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 关键改进
|
|||
|
|
|
|||
|
|
### 1. 正确的 Content-Type
|
|||
|
|
- **修改前**: `application/json`
|
|||
|
|
- **修改后**: `application/x-www-form-urlencoded`
|
|||
|
|
|
|||
|
|
### 2. 参数传递方式
|
|||
|
|
- **修改前**: 使用 `json={}` 参数
|
|||
|
|
- **修改后**: 使用 `data={}` 参数
|
|||
|
|
|
|||
|
|
### 3. FastAPI 自动处理
|
|||
|
|
FastAPI 会自动:
|
|||
|
|
- 解析 form-data 格式的参数
|
|||
|
|
- 进行类型转换
|
|||
|
|
- 生成正确的 Swagger 文档
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 重要提示
|
|||
|
|
|
|||
|
|
### 1. 不向后兼容
|
|||
|
|
❌ **此修复不向后兼容**
|
|||
|
|
|
|||
|
|
所有调用这些接口的客户端需要:
|
|||
|
|
- 将 `json=` 改为 `data=`
|
|||
|
|
- 将 `Content-Type` 从 `application/json` 改为 `application/x-www-form-urlencoded`
|
|||
|
|
|
|||
|
|
### 2. 数组参数处理
|
|||
|
|
对于接口5(删除文件),`logIds` 参数:
|
|||
|
|
- **传递方式**: 逗号分隔的字符串,如 `"10001,10002,10003"`
|
|||
|
|
- **后端处理**: 自动解析为整数列表
|
|||
|
|
|
|||
|
|
### 3. 可选参数
|
|||
|
|
可选参数可以:
|
|||
|
|
- 不传递
|
|||
|
|
- 传递空值
|
|||
|
|
- 传递默认值
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 对比总结
|
|||
|
|
|
|||
|
|
| 项目 | 修改前 | 修改后 |
|
|||
|
|
|------|--------|--------|
|
|||
|
|
| **参数格式** | JSON body | Form-data |
|
|||
|
|
| **Content-Type** | application/json | application/x-www-form-urlencoded |
|
|||
|
|
| **Python requests** | `json={}` | `data={}` |
|
|||
|
|
| **curl** | `-H "Content-Type: application/json" -d '{...}'` | `-d "key=value"` |
|
|||
|
|
| **Swagger UI** | Request body | Form data |
|
|||
|
|
| **测试状态** | ❌ 2 failed | ✅ 7 passed |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 修复验证清单
|
|||
|
|
|
|||
|
|
- [x] 将所有接口改为使用 Form 参数
|
|||
|
|
- [x] 更新 GetToken 接口(15个参数)
|
|||
|
|
- [x] 更新 FetchInnerFlow 接口(7个参数)
|
|||
|
|
- [x] 更新 CheckParseStatus 接口(2个参数)
|
|||
|
|
- [x] 更新 DeleteFiles 接口(3个参数)
|
|||
|
|
- [x] 更新 GetBankStatement 接口(4个参数)
|
|||
|
|
- [x] 更新所有测试代码
|
|||
|
|
- [x] 运行测试通过(7/7 passed)
|
|||
|
|
- [x] 更新 README.md 示例
|
|||
|
|
- [x] 创建修复文档
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📄 相关文档
|
|||
|
|
|
|||
|
|
1. **接口参数检查报告.md** - 参数对比分析
|
|||
|
|
2. **修复总结.md** - 参数修复记录
|
|||
|
|
3. **form-data修复说明.md** - 本次修复说明
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 修复结论
|
|||
|
|
|
|||
|
|
**状态**: ✅ **修复完成**
|
|||
|
|
|
|||
|
|
所有接口已改为使用 form-data 方式传输参数,与接口文档要求完全一致。Mock 服务器现在完全符合真实接口的调用方式。
|
|||
|
|
|
|||
|
|
**下一步**: 可以开始使用修复后的 Mock 服务器进行开发和测试。请确保所有客户端代码使用 `data=` 参数而不是 `json=` 参数。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**修复人员**: Claude Code
|
|||
|
|
**修复日期**: 2026-03-03
|
|||
|
|
**版本**: v1.2.0
|