POST 在 FastAPI 中仅使用一个数字参数调用

POST call with only one numeric parameter in FastAPI

我有一个名为 main.py 的文件,我在其中放置了一个只有一个输入参数(整数)的 POST 调用,其简化代码为:

from fastapi import FastAPI

app = FastAPI()

@app.post("/do_something/")
async def do_something(process_id: int):
    # some code
    return {"process_id": process_id}

现在,如果我运行测试代码,保存在文件test_main.py中,即:

from fastapi.testclient import TestClient
from main import app

client = TestClient(app)

def test_do_something():
    response = client.post(
        "/do_something/",
        json={
            "process_id": 16
        }
    )
    return response.json()

print(test_do_something())

我明白了

{'detail': [{'loc': ['query', 'process_id'], 'msg': 'field required', 'type': 'value_error.missing'}]}

我不知道错误是什么。它必须保持 POST 调用。

错误基本上是说,缺少必需的查询参数“process_id”。原因是您发送了一个带有请求正文(有效负载)的 POST 请求,即 JSON 数据;但是,您的端点需要一个查询参数。要以 JSON 格式接收数据,需要 create a Pydantic BaseModel 如下所示,并以与您已经执行的方式相同的方式从客户端发送数据。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    process_id: int
    
@app.post("/do_something/")
async def do_something(item: Item):
    # some code
    return item

但是,如果您需要传递一个 query parameter,那么您可以按照与之前相同的方式创建一个端点,但在客户端中您将参数添加到 URL 本身,如如下所示:

def test_do_something():
    response = client.post("/do_something/?process_id=16")
    return response.json()

更新

或者,您可以使用 Body(..., embed=True) 传递单个主体参数,如下所示:

@app.post("/do_something/")
async def do_something(process_id: int = Body(..., embed=True)):
    return process_id