Skip to content

5. Request Body


1. Request Body

  • 클라이언트에서 API로 데이터를 보내야 할 때 request body로 보내야 한다.
  • request body는 클라이언트가 API로 보낸 데이터를 의미하며, response body는 API가 클라이언트로 보낸 데이터를 의미한다.
  • API는 거의 항상 response body를 보내게 되어 있지만, 클라이언트는 항상 request body를 보낼 필요는 없다.
  • request body를 선언하려면 Pydantic 모델을 사용하면 된다.

클라이언트에서 API로 데이터를 보내려면 POST, PUT, DELETE, PATCH 중 하나를 사용해야 한다. 일반적으로 request body를 보낼 때는 POST request를 사용한다.


2. Import Pydantic's BaseModel

  • 먼저, pydanticBaseModel을 임포트한다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

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


3. Create your data model

  • 그런 다음 데이터 모델을 BaseModel에서 상속하는 클래스로 선언한다.
  • 그리고 모든 속성에 대해 표준 Python 타입을 사용한다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

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


  • query 매개변수를 선언할 때와 마찬가지로 모델 속성에 기본값이 있는 경우 이 속성은 required가 아니다.
  • 기본값이 없는 경우 required이기 때문에 None을 사용하여 optional로 만들어야 한다.


4. Declare it as a parameter

  • path operation에 추가하려면 path 및 query 매개변수를 선언한 것과 같은 방식으로 선언한다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

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


  • 위의 예제와 같이 Item으로 타입을 선언한다.


5. Use the model

  • 함수 내에서 모델 객체의 모든 속성에 직접 접근할 수 있다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()

    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})

    return item_dict


6. Request body + path parameters

  • request body와 path 매개변수를 동시에 선언할 수 있다.
  • FastAPI는 path 매개변수와 일치하는 함수 매개변수를 path에서 가져와야 하고, Pydantic 모델로 선언된 함수 매개변수를 request body에서 가져와야 한다는 것을 인식한다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

@app.put("/items/{item_id}")
async def create_item(item_id: int, item:Item):
    return {"item_id": item_id, item.dict()}


7. Request body + path + query parameters

  • body, path, query 매개변수를 동시에 선언할 수도 있다.
  • FastAPI는 각각을 인식하고 올바른 위치에서 데이터를 가져온다.


from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
    result = {"item_id": item_id, item.dict()}

    if q:
        result.update({"q": q})

    return result


  • 위의 예제에서 함수 매개변수는 다음과 같이 인식된다.


1] item_id

  • path에서 또한 선언된 것이기 때문에 path 매개변수로 인식된다.

2] item

  • Pydantic 모델 타입으로 선언된 것이기 때문에 request body로 인식된다.

3] q

  • int, float, str, bool 등 표준 Python 단일 타입으로 선언된 것이기 때문에 query 매개변수로 인식된다.

References