问题描述
这里写了一个接口,功能是上传文件,接口参数是file文件和一个id字符串
@gpt_router.post("/uploadfiles")
async def create_upload_files(files: List[UploadFile] = File(...), task_id: str = None):
# print('files:',files)
print(f"Task ID: {task_id}")
return HttpResponse.ok(message="上传成功")
Apifox请求之后,文件可以接收到,但是接收不到id
解决方法
使用 Form 类型来接收 form-data 中的字段,包括字符串。
引入一下From,更改一下参数
from fastapi import Form
@gpt_router.post("/uploadfiles")
async def create_upload_files(files: List[UploadFile] = File(...), task_id: str = Form(None)):
# print('files:',files)
print(f"Task ID: {task_id}")
return HttpResponse.ok(message="上传成功")
弯路总结
弯路描述
查看Apifox请求中的请求头的时候,发现content-type的值是application/json,不是传的from-data类型。
于是乎,在请求头中设置Content-type为multipart/form-data,请求之后依然接收不到task_id,同时请求头Header中content-type的值依然是application/json。(奇怪喔)
然后一顿搜索,甚至官方文档也看了,依然不行。
纵观全局
在查看Apifox官方文档的时候了解到,只要请求的时候点选了数据类型,请求的Content-type其实就已经更改了,至于为什么请求完的Header里content-type还是application/json就不得而知了。(知道为什么的大佬可以在评论区讲解一下,提前致谢)
所以到这里只要我点选的是from-data,那么content-type就已经是multipart/form-data了,所以请求没有错,那可能就是后端出现的问题,解决问题的方向错了。
再来看下问题,同样的from-data数据,文件就可以接收到,而字符串不行,那说明两者中,文件是正确的,字符串在哪里出了问题,我们对比下参数部分代码。
提取一下
files: List[UploadFile] = File(...)
task_id: str = None
不难看出是= File(...)
和= None
默认值的区别,那就是字符串不是这么接收的,或者说应该和File一样的接收格式,那么具体该怎么接收from-data数据呢?
查了一下发现:
在 FastAPI 中,要使用 Form 类型来接收 form-data 中的字段,包括字符串。
心机之蛙一直摸你肚子
原来是接收方式不对,这也怪鄙人python后端不熟练的原因,闹了笑话,见笑了。
知道原因就好办了,引入一下From,更改一下参数
from fastapi import Form
task_id: str = Form(None)
测试
完活收工
小结
解决问题所收获的的不是解决问题本身,而是解决问题的过程以及其中的思路、以及无法用文字描述的东西。