问题描述
通过postman调用fastapi编写的文件接口报错,如下图:
{
"detail": "There was an error parsing the body"
}
问题的解决过程
postman本身的问题
postman有个work directory的概念,所以再使用postman上传的文件必须在这个目录下,否则读取不到文件,导致发送给接口的数据是空数据,导致fastapi获取不到body.
还有个方法验证是不是你工具的问题,那就是通过cur的方式:
curl --location 'http://192.168.1.13:8000/v1/pdf/upload' \
--form 'file=@"run_test.pdf"'
如果这个命令能成功,那说明可能是你工具的问题了。
FastAPI的问题
执行完上面的步骤还不行,那简直就是要了老命了。经过一番折腾,发现是router的配置问题,
在router的配置中,url是以 `/`结尾的,但是我的postman中没有写/,所以导致请求重定向(307),最终导致了这个报错。(具体原因,我还不太清楚,如果有老哥明白,帮忙给评论一下。)
加上/后,就能正常请求了。
怎么在框架层面处理这个问题
可以对APIRouter进行一下处理,代码如下:
from fastapi import APIRouter as FastAPIRouter
from typing import Any, Callable
from fastapi.types import DecoratedCallable
class APIRouter(FastAPIRouter):
def api_route(
self, path: str, *, include_in_schema: bool = True, **kwargs: Any
) -> Callable[[DecoratedCallable], DecoratedCallable]:
if path.endswith("/"):
path = path[:-1]
add_path = super().api_route(
path, include_in_schema=include_in_schema, **kwargs
)
alternate_path = path + "/"
add_alternate_path = super().api_route(
alternate_path, include_in_schema=False, **kwargs
)
def decorator(func: DecoratedCallable) -> DecoratedCallable:
add_alternate_path(func)
return add_path(func)
return decorator
使用了上面的代码就能正常处理斜杠的问题了。