如何在FastAPI接口中允许None类型作为参数?
问题
我定义了用于参数的BaseModel类A,希望param1可传入None值:
class A(BaseModel): param1: Union[int, None] = None #Optional[int] = None param2: Optional[int] @app.post("/A_endpoint/", response_model=A) def create_A(a: A): # do something with a return a
调用接口时使用以下curl命令:
curl -X 'POST' \ 'http://0.0.0.0:7012/A_endpoint' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "param1": None, "param2": 1, }'
出现422错误:
{ "detail": [ { "loc": [ "body", 65 ], "msg": "Expecting value: line 4 column 14 (char 65)", "type": "value_error.jsondecode", "ctx": { "msg": "Expecting value", "doc": "{\n \"param1\" = None, \n \"param2\" = 1}", "pos": 65, "lineno": 4, "colno": 14 } } ] }
已知省略param1时默认值为None可行,但想知道如何显式允许param1传入None值。
解决方法
你的BaseModel定义本身没有问题,Union[int, None](或Optional[int])已经正确声明了param1可以为int或None值。报错的核心原因是JSON语法中没有None这个值,Python的None对应JSON的null,你在curl请求体里用了None导致JSON解析失败。
只需把curl命令里的None替换成null即可:
curl -X 'POST' \ 'http://0.0.0.0:7012/A_endpoint' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "param1": null, "param2": 1 }'
另外补充两点:
Optional[int]是Union[int, None]的语法糖,两种写法效果完全一致,任选其一即可。- 你的param2声明为
Optional[int]但未设置默认值,所以请求时必须显式传入它的值(可以是int或null),否则也会触发验证错误。
内容的提问来源于stack exchange,提问作者edgarbc
相关产品推荐
相关产品推荐

