[FastAPI] get, post
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 로 넣고 한번 찍어본다.