지금까지는 GET방식이기에 URL 및 Request Header로 값이 넘어왔다. 하지만 POST방식에서는 Request Body로 넘어오기에 이전가지의 방식으로는 데이터를 받을 수 없다.

Request Body는 Pydantic Model을 이용하여 값을 받을 수 있다.

Pydantic BaseModel

먼저 Pydantic모듈의 BaseModel을 import하여 Class를 구성한다.

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
		pass

이후 Item클래스에서 Requsest Body로 받을 데이터를 정의하면 된다.

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

이전에 parameter를 정의한 것과 같이, 형식과 Default 값을 명시해준다.

위와 같이 선언이 되면 description, tax는 optional value가 되며, 나머지는 required value가 된다.

{
    "name": "Foo",
    "price": 45.2
},
{
    "name": "Foo",
    "description": "An optional description",
    "price": 45.2,
    "tax": 3.5
}

POST Method Parameter

이제 path를 생성하고 함수에서 어떻게 데이터를 받는지 볼 차례이다.

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

create_item함수에서 item이라는 parameter를 받는다. 이때의 형식은 위에서 우리가 정의한 **Item 객체라고 명시**한다.

위와 같이 정의되었을 때, FastAPI에서 처리하는 과정은 아래와 같다.

  1. JSON으로 넘어온 Request Body 내용을 읽는다.
  2. 필요시 해당 데이터를 상응되는 타입으로 변환한다.
  3. 데이터 유효성 검사를 한다. → 만약 invalid하면 error를 반환한다.