如何在 FastAPI 中 POST 具有单个主体参数的 JSON?

LJG*_*LJG 7 python 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}
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行保存在文件中的测试代码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())
Run Code Online (Sandbox Code Playgroud)

我得到:

{'detail': [{'loc': ['query', 'process_id'], 'msg': 'field required', 'type': 'value_error.missing'}]}
Run Code Online (Sandbox Code Playgroud)

我不明白这是什么错误。有必要继续呼吁POST

Chr*_*ris 8

process_id该错误基本上表明缺少所需的查询参数。原因是您发送了带有 request 的 POST 请求body,即 JSON 负载;但是,您的端点需要一个查询参数。要接收 JSON 格式的数据,需要创建一个 Pydantic BaseModel \xe2\x80\x94(如下所示)\xe2\x80\x94,并按照与您已经做的相同的方式从客户端发送数据。

\n
from fastapi import FastAPI\nfrom pydantic import BaseModel\n\napp = FastAPI()\n\nclass Item(BaseModel):\n    process_id: int\n    \n@app.post("/do_something")\ndef do_something(item: Item):\n    return item\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果您需要传递查询参数,则可以按照与之前相同的方式创建端点,但在客户端,您需要将参数添加到 URL 本身,如文档中所述如下所示:

\n
def test_do_something():\n    response = client.post("/do_something?process_id=16")\n    return response.json()\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n

或者,您可以使用 传递单个主体参数Body(..., embed=True),如下所示(有关如何发布 JSON 数据的更多详细信息和选项,请参阅此答案此答案):

\n
@app.post("/do_something")\ndef do_something(process_id: int = Body(..., embed=True)):\n    return process_id\n
Run Code Online (Sandbox Code Playgroud)\n