FastAPI로 API 구축 애플리케이션이 POST 요청을 통해 JSON 데이터를 보내는 동안 오류 코드 422(처리할 수 없는 엔터티)를 표시합니다. 반면에 GET 요청은 원활하게 작동합니다. 이 문제는 JSON을 구문 분석하거나 UTF-8 인코딩을 사용하거나 HTTP 헤더를 수정하려는 시도에도 불구하고 지속됩니다.
422 상태 코드가 포함된 응답은 다음을 나타냅니다. 제출된 데이터에 오류가 발생하는 경우가 종종 있으며 요소가 누락되거나 형식이 잘못 지정되어 발생하는 경우가 많습니다. 이 경우 문제는 POST 요청의 예상 형식에서 비롯됩니다. 기본적으로 FastAPI는 사용자 입력을 JSON 페이로드가 아닌 쿼리 매개변수로 예상합니다. 결과적으로 클라이언트가 JSON 데이터를 전송하려고 시도하면 422 오류가 발생합니다.
다음 네 가지 옵션은 엔드포인트를 올바르게 정의하기 위한 고유한 접근 방식을 제공합니다. POST 요청에서 JSON 데이터를 처리합니다:
Pydantic 모델을 사용하면 엔드포인트에 대해 예상되는 데이터 구조를 지정할 수 있습니다.
from pydantic import BaseModel class User(BaseModel): user: str @app.post('/') def main(user: User): return user
이 방법은 특수한 "embed" 매개변수를 활용하여 본문을 단일 매개변수로 처리합니다.
from fastapi import Body @app.post('/') def main(user: str = Body(..., embed=True)): return {'user': user}
덜 권장되지만 이 접근 방식은 키-값 쌍을 Dict 유형으로 정의합니다.
from typing import Dict, Any @app.post('/') def main(payload: Dict[Any, Any]): return payload
이 옵션에는 요청 개체를 사용하여 수신된 JSON 데이터를 구문 분석하는 작업이 포함됩니다.
from fastapi import Request @app.post('/') async def main(request: Request): return await request.json()
제공된 솔루션을 테스트하려면 주어진 지침을 따르십시오. 단계:
import requests url = 'http://127.0.0.1:8000/' payload ={'user': 'foo'} resp = requests.post(url=url, json=payload) print(resp.json())
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!