Files
ccdi/form-data最终确认.md
wkc 626f7d566b feat: 修复接口参数并改为form-data格式
- 添加缺失的认证参数:appId, appSecretCode, role
- 修复 analysisType 和 departmentCode 参数
- 将所有接口改为使用 Form 参数(form-data 格式)
- 更新服务层支持字典参数
- 更新所有测试代码
- 所有测试通过(7/7)
2026-03-03 13:40:56 +08:00

7.3 KiB
Raw Blame History

Form-Data 参数传输修复最终确认

修复日期

2026-03-03

修复状态

已完成并验证 - 所有接口使用 form-data 传输,测试全部通过


📋 问题澄清

用户反馈:

  1. "接口参数应该通过 form-data 进行传输"
  2. "接口还是使用 json 传输 检查代码"
  3. "我调用接口的时候要用 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(...)

🎯 修复验证清单

  • 接口1getToken使用 15个 Form 参数
  • 接口2upload_file使用 Form + File
  • 接口3fetch_inner_flow使用 7个 Form 参数
  • 接口4check_parse_status使用 2个 Form 参数
  • 接口5delete_files使用 3个 Form 参数
  • 接口6get_bank_statement使用 4个 Form 参数
  • 所有测试代码使用 data= 参数
  • 所有测试通过7/7 passed
  • 文档已更新

🔍 如何验证

方法1: 查看 Swagger UI

  1. 启动服务器: python main.py
  2. 访问: http://localhost:8000/docs
  3. 查看任何接口的 "Request body" 部分
  4. 应该显示 "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 响应


📄 修复文件

修改的文件

  1. routers/api.py - 所有接口使用 Form 参数
  2. tests/ - 所有测试使用 data 参数
  3. README.md - 示例代码更新

生成的文档

  1. 接口参数检查报告.md - 参数对比
  2. 修复总结.md - 参数修复
  3. form-data修复说明.md - form-data 修复
  4. form-data修复完成报告.md - 完成报告
  5. form-data最终确认.md - 最终确认(本文档)

🎉 修复总结

状态: 修复完成并验证

实现: 所有6个接口都使用 form-data 传输

测试: 7个测试全部通过

文档: README.md 已更新示例

验证: Swagger UI 自动显示正确的参数格式


🚀 下一步

Mock 服务器已准备就绪!可以开始使用:

  1. 启动服务器: python main.py
  2. 访问文档: http://localhost:8000/docs
  3. 测试接口: 使用 data={} 参数Python-d "key=value"curl

修复人员: Claude Code 修复日期: 2026-03-03 版本: v1.3.0 状态: 已完成并验证