我有一个名为的文件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。
process_id该错误基本上表明缺少所需的查询参数。原因是您发送了带有 request 的 POST 请求body,即 JSON 负载;但是,您的端点需要一个查询参数。要接收 JSON 格式的数据,需要创建一个 Pydantic BaseModel \xe2\x80\x94(如下所示)\xe2\x80\x94,并按照与您已经做的相同的方式从客户端发送数据。
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\nRun Code Online (Sandbox Code Playgroud)\n但是,如果您需要传递查询参数,则可以按照与之前相同的方式创建端点,但在客户端,您需要将参数添加到 URL 本身,如文档中所述如下所示:
\ndef test_do_something():\n response = client.post("/do_something?process_id=16")\n return response.json()\nRun Code Online (Sandbox Code Playgroud)\n或者,您可以使用 传递单个主体参数Body(..., embed=True),如下所示(有关如何发布 JSON 数据的更多详细信息和选项,请参阅此答案和此答案):
@app.post("/do_something")\ndef do_something(process_id: int = Body(..., embed=True)):\n return process_id\nRun Code Online (Sandbox Code Playgroud)\n