首頁 >後端開發 >Python教學 >FastAPI POST 請求錯誤 422:如何正確處理 JSON 資料?

FastAPI POST 請求錯誤 422:如何正確處理 JSON 資料?

Patricia Arquette
Patricia Arquette原創
2025-01-03 01:19:38138瀏覽

FastAPI POST Request Error 422: How to Properly Handle JSON Data?

FastAPI:了解並解決透過POST 要求傳送JSON 資料時出現的錯誤422

問題描述

使用FastAPI 建立API,該應用程式在透過POST 請求發送JSON資料時顯示錯誤代碼 422(無法處理的實體)。另一方面,GET 請求則運作順利。儘管嘗試解析 JSON、使用 UTF-8 編碼或修改 HTTP 標頭,此問題仍然存在。

詳細說明

帶有 422 狀態代碼的回應表示提交的資料出現錯誤,通常是由於元素缺失或格式不正確造成的。在本例中,問題源自於 POST 請求的預期格式。預設情況下,FastAPI 將使用者輸入視為查詢參數,而不是 JSON 負載。因此,客戶端嘗試傳輸 JSON 資料會導致 422 錯誤。

解決方案選項

以下四個選項提供了不同的方法來正確定義端點處理來自POST 請求的JSON 資料:

1。使用 Pydantic 模型

使用 Pydantic 模型可讓您為端點指定預期的資料結構。

from pydantic import BaseModel

class User(BaseModel):
    user: str

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

2.使用主體參數嵌入

此方法利用特殊的「embed」參數將主體視為單一參數。

from fastapi import Body

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

3.使用 Dict 類型(不太推薦)

雖然不太推薦,但此方法將鍵值對定義為 Dict 類型。

from typing import Dict, Any

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

4 。直接使用請求物件

此選項涉及使用請求物件來解析接收到的 JSON 資料。

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);
    });

以上是FastAPI POST 請求錯誤 422:如何正確處理 JSON 資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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