Request Body & Response Body란?
- Request Body : 클라이언트가 API로 데이터를 보낼때 사용되는 데이터
- Response Body : API가 request의 응답으로 클라이언트에게 보내는 데이터
path 파라미터, query 파라미터는 url에서 어떤 데이터를 보내는지 볼 수 있다.
이 데이터들 말고 url에서 보이지 않는 데이터를 실어 보낼 때 body 파라미터를 사용한다고 생각하면 된다.
API(백엔드)는 거의 모든경우에 response body를 클라이언트에게 보내야 한다.
하지만 클라이언트는 꼭 request body를 보내지 않아도 된다.
fast api에서는 request body를 만들기 위해선 Pydantic models 를 사용한다
Pydantic의 BaseModel import 하기
아래처럼 BaseModel을 import하여 request body를 만든다
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item
리퀘스트 바디를 만드는 방법은 아래처럼 BaseModel을 상속하면 된다.
클래스의 attribute는 파이썬의 기본형 자료를 사용한다.
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
Request Body의 default value, optional, required
쿼리 파라미터와 비슷하게 default valute를 넣어줄 수 있고, None값을 넣어주면 optional이 되고, 아무값도 넣어주지 않으면 required가 된다
optional은 아래처럼 Optional이라고 명시해주자
description: Optional[str] = None
tax: Optional[float] = None
자 그럼 API 사이트에 들어가보자
http://127.0.0.1:8000/docs
위 예제는 post로 mapping하였으므로 url로 테스트하기가 까다롭다.
아래처럼 API 사이트에서 try it 을 누르고 리퀘스트를 보내보자
그럼 아래와 같은 결과물이 나온다
만약 required 파라미터를 보내지 않을경우 다음과 같이 나온다
모델 사용하기
아래의 예제처럼 모델 attribute에 직접 접근하거나 dict로 받아와 데이터를 추가한 뒤 업데이트 해 줄 수 있다
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@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
Request body + path + query parameters
아래의 예제는 함수 파라미터에 request body, path parameter, query parameter가 모두 있는 예제이다
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@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
위 함수 파라미터는 fast api가 다음과 같이 해석한다
- Parameter가 Path에 정의되어 있으면 path로 해석한다
- path를 제외하고 sigular typ(int, float, bool str, etc)이면 query parameter로 해석한다
- Parameter가 Pydantic Model로 정의되어 있으면 Request Body로 해석한다
'Fast API > fastapi배우기' 카테고리의 다른 글
Fast API 배우기 6부 - Body 클래스 (0) | 2021.10.21 |
---|---|
Fast API 배우기 5부 - Path 클래스 (0) | 2021.10.21 |
Fast API 배우기 4부 - Query 클래스 (0) | 2021.10.20 |
Fast API 배우기 2부 - query parameters (0) | 2021.10.19 |
Fast API 배우기 1부 - 시작 및 path parameter (0) | 2021.10.18 |
댓글