277 lines
7.3 KiB
Markdown
277 lines
7.3 KiB
Markdown
|
|
# ✅ 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)
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
@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="机构编码"),
|
|||
|
|
):
|
|||
|
|
# 构建请求对象并处理
|
|||
|
|
...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ✅ 测试验证
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
======================== 7 passed, 1 warning in 0.06s =========================
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**所有 7 个测试用例通过** ✅
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📖 使用示例
|
|||
|
|
|
|||
|
|
### ✅ Python requests(正确方式)
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
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 命令(正确方式)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用 -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(正确方式)
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 使用 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
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# ❌ 错误:使用 json 参数
|
|||
|
|
response = requests.post(
|
|||
|
|
"http://localhost:8000/account/common/getToken",
|
|||
|
|
json={ # ❌ 不支持 JSON
|
|||
|
|
"projectNo": "test_001",
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**结果**: 422 Unprocessable Entity
|
|||
|
|
|
|||
|
|
### ❌ 错误方式2:使用 Content-Type: application/json
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# ❌ 错误:设置 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(...)` |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 修复验证清单
|
|||
|
|
|
|||
|
|
- [x] 接口1(getToken)使用 15个 Form 参数
|
|||
|
|
- [x] 接口2(upload_file)使用 Form + File
|
|||
|
|
- [x] 接口3(fetch_inner_flow)使用 7个 Form 参数
|
|||
|
|
- [x] 接口4(check_parse_status)使用 2个 Form 参数
|
|||
|
|
- [x] 接口5(delete_files)使用 3个 Form 参数
|
|||
|
|
- [x] 接口6(get_bank_statement)使用 4个 Form 参数
|
|||
|
|
- [x] 所有测试代码使用 `data=` 参数
|
|||
|
|
- [x] 所有测试通过(7/7 passed)
|
|||
|
|
- [x] 文档已更新
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 如何验证
|
|||
|
|
|
|||
|
|
### 方法1: 查看 Swagger UI
|
|||
|
|
|
|||
|
|
1. 启动服务器: `python main.py`
|
|||
|
|
2. 访问: http://localhost:8000/docs
|
|||
|
|
3. 查看任何接口的 "Request body" 部分
|
|||
|
|
4. 应该显示 "Form data" 而不是 "JSON"
|
|||
|
|
|
|||
|
|
### 方法2: 运行测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd lsfx-mock-server
|
|||
|
|
python -m pytest tests/ -v
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
应该看到: `7 passed`
|
|||
|
|
|
|||
|
|
### 方法3: 手动测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
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
|
|||
|
|
**状态**: ✅ 已完成并验证
|