본문 바로가기
Fast API/fastapi배우기

Fast API 배우기 3부 - Request Body

by 붕어사랑 티스토리 2021. 10. 20.
반응형

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가 다음과 같이 해석한다

 

  1. Parameter가 Path에 정의되어 있으면 path로 해석한다
  2. path를 제외하고 sigular typ(int, float, bool str, etc)이면 query parameter로 해석한다
  3. Parameter가 Pydantic Model로 정의되어 있으면 Request Body로 해석한다

 

반응형

댓글