首頁 >後端開發 >Python教學 >如何修復 FastAPI 在 POSTing JSON 資料時出現的 422 錯誤?

如何修復 FastAPI 在 POSTing JSON 資料時出現的 422 錯誤?

Patricia Arquette
Patricia Arquette原創
2024-12-17 01:24:24652瀏覽

How to Fix FastAPI's 422 Error When POSTing JSON Data?

如何解決透過POST 要求傳送JSON 資料時FastAPI 的422 錯誤

422 無法處理實體錯誤通常發生在要求的負載上時正確,但與伺服器的期望不符。在這種特定情況下,您遇到此錯誤是因為您的要求正在嘗試將 JSON 資料傳送到預期接收資料作為查詢參數的端點。

要解決此問題,有多種方法 可用:

選項1:利用Pydantic模型

  • Pydantic 模型可讓您指定端點的預期資料結構。下面的程式碼片段說明如何定義接受表示為Pydantic 模型的JSON 資料的端點:
from pydantic import BaseModel

class User(BaseModel):
    user: str

@app.post('/')
def main(user: User):
    return user

選項2:使用主體參數

  • 如果不需要Pydantic 模型,您可以利用Body 參數。 'Body' 參數embed 允許您將請求正文作為函數簽名的一部分嵌入:
from fastapi import Body

@app.post('/')
def main(user: str = Body(..., embed=True)):
    return {'user': user}

選項3:使用字典類型

  • 另一種方法(雖然不太推薦)是使用Dict 類型來定義鍵值對。但是,此技術不支援自訂驗證:
from typing import Dict, Any

@app.post('/')
def main(payload: Dict[Any, Any]):
    return payload

選項4:直接存取請求正文

  • Starlette 的Request 物件允許直接存取使用await request.json() 存取已解析的JSON 請求正文。但是,此方法不提供自訂驗證,並且需要對端點定義使用 async def:
from fastapi import Request

@app.post('/')
async def main(request: Request):
    return await request.json()

測試選項

使用Python「請求」函式庫:

import requests

url = 'http://127.0.0.1:8000/'
payload = {'user': 'foo'}
resp = requests.post(url=url, json=payload)
print(resp.json())

使用JavaScript 的Fetch API:

fetch('/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({'user': 'foo'})
}).then(resp => resp.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

透過選擇並實作其中一種方法,您可以成功處理JSON 資料您的FastAPI 端點,解決了422 錯誤。

以上是如何修復 FastAPI 在 POSTing JSON 資料時出現的 422 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn