- 添加缺失的认证参数:appId, appSecretCode, role - 修复 analysisType 和 departmentCode 参数 - 将所有接口改为使用 Form 参数(form-data 格式) - 更新服务层支持字典参数 - 更新所有测试代码 - 所有测试通过(7/7)
7.3 KiB
7.3 KiB
✅ Form-Data 参数传输修复最终确认
修复日期
2026-03-03
修复状态
✅ 已完成并验证 - 所有接口使用 form-data 传输,测试全部通过
📋 问题澄清
用户反馈:
- "接口参数应该通过 form-data 进行传输" ✅
- "接口还是使用 json 传输 检查代码" ❓
- "我调用接口的时候要用 formdata 传参 为什么改回 json?????" ✅
结论: 接口应该使用 form-data 传输参数,而不是 JSON body
✅ 最终实现
所有接口都使用 Form 参数
| 接口 | 路径 | 参数数量 | 传输方式 | 状态 |
|---|---|---|---|---|
| 1 | /account/common/getToken |
15个 Form 参数 | form-data | ✅ |
| 2 | /watson/api/project/remoteUploadSplitFile |
2个 (Form + File) | form-data | ✅ |
| 3 | /watson/api/project/getJZFileOrZjrcuFile |
7个 Form 参数 | form-data | ✅ |
| 4 | /watson/api/project/upload/getpendings |
2个 Form 参数 | form-data | ✅ |
| 5 | /watson/api/project/batchDeleteUploadFile |
3个 Form 参数 | form-data | ✅ |
| 6 | /watson/api/project/getBSByLogId |
4个 Form 参数 | form-data | ✅ |
🔧 代码实现
接口1示例(getToken)
@router.post("/account/common/getToken")
async def get_token(
projectNo: str = Form(..., description="项目编号"),
entityName: str = Form(..., description="项目名称"),
userId: str = Form(..., description="操作人员编号"),
userName: str = Form(..., description="操作人员姓名"),
appId: str = Form("remote_app", description="应用ID"),
appSecretCode: str = Form(..., description="安全码"),
role: str = Form("VIEWER", description="角色"),
orgCode: str = Form(..., description="行社机构号"),
entityId: Optional[str] = Form(None, description="企业统信码"),
xdRelatedPersons: Optional[str] = Form(None, description="信贷关联人"),
jzDataDateId: str = Form("0", description="金综链流水日期"),
innerBSStartDateId: str = Form("0", description="行内流水开始日期"),
innerBSEndDateId: str = Form("0", description="行内流水结束日期"),
analysisType: str = Form("-1", description="分析类型"),
departmentCode: str = Form(..., description="机构编码"),
):
# 构建请求对象并处理
...
✅ 测试验证
======================== 7 passed, 1 warning in 0.06s =========================
所有 7 个测试用例通过 ✅
📖 使用示例
✅ Python requests(正确方式)
import requests
# 使用 data 参数发送 form-data
response = requests.post(
"http://localhost:8000/account/common/getToken",
data={ # ✅ 使用 data 参数
"projectNo": "test_project_001",
"entityName": "测试企业",
"userId": "902001",
"userName": "902001",
"appId": "remote_app",
"appSecretCode": "your_secret_code",
"role": "VIEWER",
"orgCode": "902000",
"departmentCode": "902000"
}
)
# 不使用 json 参数!
# response = requests.post(..., json={...}) # ❌ 错误方式
✅ curl 命令(正确方式)
# 使用 -d 参数发送 form-data
curl -X POST http://localhost:8000/account/common/getToken \
-d "projectNo=test_001" \
-d "entityName=测试企业" \
-d "userId=902001" \
-d "userName=902001" \
-d "appId=remote_app" \
-d "appSecretCode=your_code" \
-d "role=VIEWER" \
-d "orgCode=902000" \
-d "departmentCode=902000"
✅ JavaScript fetch(正确方式)
// 使用 FormData 对象
const formData = new FormData();
formData.append('projectNo', 'test_001');
formData.append('entityName', '测试企业');
formData.append('userId', '902001');
formData.append('userName', '902001');
formData.append('appId', 'remote_app');
formData.append('appSecretCode', 'your_code');
formData.append('role', 'VIEWER');
formData.append('orgCode', '902000');
formData.append('departmentCode', '902000');
fetch('http://localhost:8000/account/common/getToken', {
method: 'POST',
body: formData // ✅ 使用 FormData
});
⚠️ 常见错误
❌ 错误方式1:使用 JSON
# ❌ 错误:使用 json 参数
response = requests.post(
"http://localhost:8000/account/common/getToken",
json={ # ❌ 不支持 JSON
"projectNo": "test_001",
...
}
)
结果: 422 Unprocessable Entity
❌ 错误方式2:使用 Content-Type: application/json
# ❌ 错误:设置 JSON Content-Type
curl -X POST http://localhost:8000/account/common/getToken \
-H "Content-Type: application/json" \
-d '{"projectNo":"test_001",...}'
结果: 422 Unprocessable Entity
📊 Content-Type 对比
| 方式 | Content-Type | Python requests | curl | FastAPI 参数 |
|---|---|---|---|---|
| JSON | application/json |
json={} |
-H "Content-Type: application/json" -d '{...}' |
request: Model |
| Form-Data | application/x-www-form-urlencoded |
data={} |
-d "key=value" |
Form(...) |
🎯 修复验证清单
- 接口1(getToken)使用 15个 Form 参数
- 接口2(upload_file)使用 Form + File
- 接口3(fetch_inner_flow)使用 7个 Form 参数
- 接口4(check_parse_status)使用 2个 Form 参数
- 接口5(delete_files)使用 3个 Form 参数
- 接口6(get_bank_statement)使用 4个 Form 参数
- 所有测试代码使用
data=参数 - 所有测试通过(7/7 passed)
- 文档已更新
🔍 如何验证
方法1: 查看 Swagger UI
- 启动服务器:
python main.py - 访问: http://localhost:8000/docs
- 查看任何接口的 "Request body" 部分
- 应该显示 "Form data" 而不是 "JSON"
方法2: 运行测试
cd lsfx-mock-server
python -m pytest tests/ -v
应该看到: 7 passed
方法3: 手动测试
curl -X POST http://localhost:8000/account/common/getToken \
-d "projectNo=test_001" \
-d "entityName=测试企业" \
-d "userId=902001" \
-d "userName=902001" \
-d "appId=remote_app" \
-d "appSecretCode=test_code" \
-d "role=VIEWER" \
-d "orgCode=902000" \
-d "departmentCode=902000"
应该返回成功的 JSON 响应
📄 修复文件
修改的文件
- routers/api.py - 所有接口使用 Form 参数
- tests/ - 所有测试使用 data 参数
- README.md - 示例代码更新
生成的文档
- 接口参数检查报告.md - 参数对比
- 修复总结.md - 参数修复
- form-data修复说明.md - form-data 修复
- form-data修复完成报告.md - 完成报告
- form-data最终确认.md - 最终确认(本文档)
🎉 修复总结
✅ 状态: 修复完成并验证
✅ 实现: 所有6个接口都使用 form-data 传输
✅ 测试: 7个测试全部通过
✅ 文档: README.md 已更新示例
✅ 验证: Swagger UI 自动显示正确的参数格式
🚀 下一步
Mock 服务器已准备就绪!可以开始使用:
- 启动服务器:
python main.py - 访问文档: http://localhost:8000/docs
- 测试接口: 使用
data={}参数(Python)或-d "key=value"(curl)
修复人员: Claude Code 修复日期: 2026-03-03 版本: v1.3.0 状态: ✅ 已完成并验证