FastAPi上传文件报错,There was an error parsing the body

问题描述

通过postman调用fastapi编写的文件接口报错,如下图:

FastAPi上传文件报错,There was an error parsing the body_第1张图片

{
    "detail": "There was an error parsing the body"
}

问题的解决过程

postman本身的问题

postman有个work directory的概念,所以再使用postman上传的文件必须在这个目录下,否则读取不到文件,导致发送给接口的数据是空数据,导致fastapi获取不到body.

FastAPi上传文件报错,There was an error parsing the body_第2张图片

还有个方法验证是不是你工具的问题,那就是通过cur的方式:

FastAPi上传文件报错,There was an error parsing the body_第3张图片 

curl --location 'http://192.168.1.13:8000/v1/pdf/upload' \
--form 'file=@"run_test.pdf"'

 如果这个命令能成功,那说明可能是你工具的问题了。

FastAPI的问题

执行完上面的步骤还不行,那简直就是要了老命了。经过一番折腾,发现是router的配置问题,

在router的配置中,url是以 `/`结尾的,但是我的postman中没有写/,所以导致请求重定向(307),最终导致了这个报错。(具体原因,我还不太清楚,如果有老哥明白,帮忙给评论一下。)

加上/后,就能正常请求了。

FastAPi上传文件报错,There was an error parsing the body_第4张图片

 FastAPi上传文件报错,There was an error parsing the body_第5张图片

FastAPi上传文件报错,There was an error parsing the body_第6张图片 

怎么在框架层面处理这个问题 

可以对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

使用了上面的代码就能正常处理斜杠的问题了。

你可能感兴趣的:(python,fastapi,json,postman)