클라이언트에서 API에 데이터를 보낼 때, Request Body, Payload라고 하는 것을 사용한다.
Request Body: 클라이언트 -> API
Response Body: API -> 클라이언트
1. Request Body
Request Body에 데이터가 항상 포함되어야 하는 것은 아니다.
Request Body에 데이터를 보내고 싶다면 POST Method를 사용한다.
(GET Method는 URL, Request Header로 데이터 전달)
POST Method는 Request Body에 넣어서 데이터를 보낸다.
Body의 데이터를 설명하는 Content - Type라는게 있다.
이건 Head필드에 있는데, 어떤 데이터 타입인지 알려줘야 한다.
그래서 우리가 Request Body의 Content - Type이 무엇인지 알려줘야 한다.
실습
POST요청으로 item을 생성하는 예제를 수행해보자.
우선 'from pydantic import BaseModel'를 임포트하자.
'pydantic BaseModel'로 Request Body를 만들자.
이건 class로 만들거다.
class Item(BaseModel):
item_id int
price: float
effect: Optional[str] = None
usage_restriction: Optional[str] = None
effect와 usage_restriction은 None이 될 수 있고, 나머지 item_id와 price는 필수다.
위와 같이 클래스를 정의해주고, 아래처럼 작성하자.
@app.post("/items/")
def create_item(item: Item):
return item
우리가 위에서 정의한 클래스를 주입해주는거다.
그럼 이 request body의 데이터 형태는 item_id과 price, effect, useage_restriction가 있다는 것을 의미한다.
이게 Data Validation이라고 볼 수 있다.
그럼 한 번 실행해보자.
/docs 를 열어서 살펴보면 Items가 보일거다.
그걸 열어주면 다음과 같이 Pydantic으로 정의한 내용을 확인할 수 있다.
item_id* integer
price* number
effect Expand all(string | null)
usage_restriction Expand all(string | null)
'*' 표시는 필수라는 의미고 나머지는 선택이라는 뜻이다.
'POST'를 클릭해도 똑같은 내용을 확인할 수 있다.
여기서 'Try it out' 버튼을 클릭해주자.
그러면 기본 설정 상태에서 실행할 수 있다.
{
"item_id": 10,
"price": 0,
"effect": "string",
"usage_restriction": "string"
}
위 상태에서 실행을 하면 결과가 나올거다.
즉, 내가 어떻게 요청하면 되는지 알려주는 페이지다.
만약 내가 지정된 타입을 벗어난 값을 입력하면 'Error: Unprocessable Content' 라고 나올거다.
실행 결과를 살펴보면 Request Body와 Response Body가 헤더를 제외하면 데이터에 있는 것은 동일하다는 것을 알 수 있다.
요청을 했을 때, Response는 어떻게 올 것인가. 데이터는 어떻게 전달할 것인가... 하는 궁금증이 생긴다면 'Request Body'를 사용하면 되는거다.
2. Response Body
그러면 Response Body는 어떨까?
API Response에서 Request Body 전체가 아니라 특정 데이터만 Response할 때 주고 싶을 수 있을거다.
데코레이터에서 response_model라는 인자로 주입이 가능하다.
class Item_Request(BaseModel):
item_id: int
price: float
effect: Optional[str] = None
usage_restriction: Optional[str] = None
class Item_Response(BaseModel):
item_id: int
price: float
effect: Optional[str] = None
Item_Request 클래스를 Request Body라고 하자.
이걸 함수의 인자로 전달하자.
Item_Reponse 클래스를 정의하자.
이 클래스는 Item_Request와 달리 usage_restriction이 없다.
'usage_restriction'는 필요없다고 판단해서 빼둔거라고 가정하자.
이렇게 Item_Request (Request 역할)와 Item_Reponse(Reponse 역할)가 준비됐다.
그리고 아래와 같이 데코레이터에서 Item_Reponse를 response_model에 넣어주자.
@app.post("/items/", response_model=Item_Response)
def create_item(item: Item_Request):
return item
Item_Reponse 클래스의 역할은 Output Data를 해당 정의에 맞춰 변형하는 것이다.
Request가 오면 그걸 토대로 어떻게 바꿔야 하는가, response_model을 바꿔주는 것이다.
Data Validation을 진행하고, Response에 대한 Json Schema를 추가해주면서 문서화도 도와준다.
이제 실행해보자.
그리고 /docs 를 열어서 'Try it out'을 누르고 실행을 해보자.
Request는 item_id, price, effect, usage_restriction이 전부 나오지만
Response는 item_id, price, effect만 나오는 것을 확인할 수 있다.
우리가 Feature를 요청할 때 Request를 할 때 쓰고, Response에서 Feature를 내려줘야 할 수도 있고 아닐 수도 있다.
그 상황이 모두 다를거다.
어떤 문제를 풀고 있느냐에 따라 다를텐데, 그때 그대로 내려줘야 한다면 동일하게 쓰면 되고, 필요한 것만 하고 싶다면 response model를 쓰면 될거다.
'끄적 > FastAPI' 카테고리의 다른 글
Pydantic (0) | 2024.12.15 |
---|---|
Form (1) | 2024.12.15 |
Path Parameter와 Quert Parameter, 그리고 Optional Parameter (0) | 2024.12.15 |
URL Parameters (0) | 2024.12.15 |
FastAPI 실습 1 (1) | 2024.12.15 |