- 添加缺失的认证参数:appId, appSecretCode, role - 修复 analysisType 和 departmentCode 参数 - 将所有接口改为使用 Form 参数(form-data 格式) - 更新服务层支持字典参数 - 更新所有测试代码 - 所有测试通过(7/7)
6.7 KiB
6.7 KiB
✅ 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 参数
修改前:
@router.post("/account/common/getToken")
async def get_token(request: GetTokenRequest):
# 接收 JSON body
...
修改后:
@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, |
| 4 | /watson/api/project/upload/getpendings |
✅ 2个 Form 参数 |
| 5 | /watson/api/project/batchDeleteUploadFile |
✅ 3个 Form 参数 |
| 6 | /watson/api/project/getBSByLogId |
✅ 4个 Form 参数 |
3. 修改的文件
核心代码
- routers/api.py - 所有接口改为使用 Form 参数
- 接口1: 15个 Form 参数
- 接口3: 7个 Form 参数
- 接口4: 2个 Form 参数
- 接口5: 3个 Form 参数(支持逗号分隔的字符串)
- 接口6: 4个 Form 参数
测试代码
- tests/conftest.py - 更新测试 fixture
- tests/test_api.py - 更新单元测试
- 将
json=改为data=
- 将
- tests/integration/test_full_workflow.py - 更新集成测试
- 将所有
json=改为data=
- 将所有
文档
- README.md - 更新使用示例
- 将示例代码改为使用
data=参数
- 将示例代码改为使用
✅ 测试结果
============================= 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
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 命令
# ✅ 使用 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 |
✅ 修复验证清单
- 将所有接口改为使用 Form 参数
- 更新 GetToken 接口(15个参数)
- 更新 FetchInnerFlow 接口(7个参数)
- 更新 CheckParseStatus 接口(2个参数)
- 更新 DeleteFiles 接口(3个参数)
- 更新 GetBankStatement 接口(4个参数)
- 更新所有测试代码
- 运行测试通过(7/7 passed)
- 更新 README.md 示例
- 创建修复文档
📄 相关文档
- 接口参数检查报告.md - 参数对比分析
- 修复总结.md - 参数修复记录
- form-data修复说明.md - 本次修复说明
🎉 修复结论
状态: ✅ 修复完成
所有接口已改为使用 form-data 方式传输参数,与接口文档要求完全一致。Mock 服务器现在完全符合真实接口的调用方式。
下一步: 可以开始使用修复后的 Mock 服务器进行开发和测试。请确保所有客户端代码使用 data= 参数而不是 json= 参数。
修复人员: Claude Code 修复日期: 2026-03-03 版本: v1.2.0