카테고리 없음

[FastAPI] get, post

GreenBNN 2024. 4. 1. 16:03

get : 사용자가 url 로 요청을 하면 서버는 요청에 맞는 데이터를 보내준다.

이때 사용자는 url 에 정보를 담아 전송할 수도 있다.

# 해당 주소로 요청하면 요청값 리턴해주기
from fastapi.responses import FileResponse

@app.get("/")
def respond():
    return FileResponse('index.html')

@app.get("/data")
def respond():
    return {'hello' : 1234}


# .../items/1?skip=0&limit=2&q=abcd
# 0번째부터 2개 보여줘 (아래 데이터 두 개 다 보여줌) q는 그냥 저장할래~

# 사용자가 정보를 요청 시 자신의 정보를 넘겨줄 수 있음
fake_items_db = [{"item_name":"Foo"}, {"item_name":"Bar"}]
@app.get("/items/{item_id}")
def read_item(item_id : int, skip: int=0, limit: int = 10, q: Optional[str] = None):
    return {"item_id": item_id, "fake_items_db_range" : fake_items_db[skip: skip + limit]}

get을 이용해서 해당 url 이 요청으로 들어오면

index.html 같은 html 을 리턴해 줄 수도 있고 그냥 데이터 형식을 리턴해줄 수도 있다.

이때 html 리턴하려면 FileResponse import 해줘야하고

fake_items_db = [{}, {}] 미리 정의한거를 리턴할 수도 있다.


post : 사용자가 서버에 데이터를 보내준다.

리소스를 생성 / 업데이트 하도록 설계된 방법이다.

필요 데이터를 http body dp 전송하므로 url 로 데이터 노출이 안된다.

# 유저에게 데이터를 받기 위함
# post 방법은 리소스를 생성/업데이트 하도록 설계됭 방법
# 필요 데이터를 http body 에 전송하므로 url 로 데이터 노출X
from pydantic import BaseModel
class DataInput(BaseModel):
    name: str

class getDataModel(BaseModel):
    name : str
    phone : int

@app.post("/")
def home_post(data_request: DataInput):
    return {"Hello": "POST", "msg" : data_request.name}

@app.post("/send")
def getDate(data : getDataModel):
    return {"dataType": "POST", "name": data.name, "phone": data.phone}

유저가 post 로 데이터를 형식에 맞게 보낸다. 이때 데이터 형식을 미리 정의해야한다.

미리 class 를 이용해 데이터 형식을 선언해주고 나중에 post 로 받고 이를 저장할 수 있다.

 

** 위 코드에서 phone : int 로 하면 127.../docs 에서 post 로 데이터를 보낼 때 오류가 떴었다.

그냥 다시 실행하니까 되네..?

INFO:     127.0.0.1:61385 - "POST / HTTP/1.1" 422 Unprocessable Entity


Python 을 이용해 post 한 값을 넣어보고 찍어볼 수 있다.

새 터미널을 열고 pyenv activate practice 가상환경 열고

pip install requests 설치해주고

Python3 을 실행시켜준다.

이후

>>> url = "http://127.0.0.1:8000/"
>>> data = {"name": "홍길동"}
>>> 
>>> res = requests.post(url, json=data)
>>> 
>>> print(res.status_code)

url 연결해주고 데이터를 post 로 넣고 한번 찍어본다.