Request Body

클라이언트에서 API로 데이터를 보내고 싶다면, request body를 사용할 수 있다. request body에 대해 정의를 하고 싶으면 Pydantic과 함께 사용이 가능하다. 생성, 수정, 삭제 같은 경우에는 상황에 맞는 http method와 함께 response를 하면 된다. 물론, GET 메서드와 함께 body를 보내는 것은 이상한 행동임.

Import Pydantic's BaseModel

첫번째로 BaseModel을 pydantic으로 부터 import 한다.

from typing import Union

from fastapi import FastAPI
**from pydantic import BaseModel**

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

app = FastAPI()

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

Create your data model

BaseModel클래스를 상속받는 data model을 선언한다.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

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

app = FastAPI()

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

data model을 선언하는 과정은 query 파라미터를 선언할때와 똑같이 필수/선택, default값 등 을 속성으로 부여해 줄 수 있다.

그래서 위의 data model이 JSON으로 변환되면 아래와 같이 된다.

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

하지만, description 과 tax의 값은 선택적이므로 아래와 같은 값도 가능하다.

{
    "name": "Foo",
    "price": 45.2
}

Declare it as a paramete

path와 query파라미터를 선언한것과 같이 타입을 만들었던 data model로 명시하여 API에 선언할 수 있다.

from typing import Union

from fastapi import FastAPI
from pydantic import BaseModel

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

app = FastAPI()

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