You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:57:23