Fastapi

[FastAPI] get post (2)

Suda_777 2024. 8. 17. 00:12
반응형

1. Get

1.1. 개념 설명

GET 요청은 주로 서버에서 데이터를 가져오기 위해 사용됩니다.
url에 파라미터를 적어 요청합니다.

장점

  • 간편하다
  • 단순한 데이터 조회에 적합
  • RESTful 방식에 적합

단점

  • 보안 문제 취약
  • 데이터 크기 제한
  • 데이터 수정 불가
  • 캐싱문제: 자주 수정되는 데이터를 조회할 때에는 과거 데이터가 조회될 수 있음

1.2. 기본적인 GET 요청

FastAPI에서 GET 요청을 처리하려면 @app.get() 데코레이터를 사용합니다.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

위의 코드에서 '/' 경로에 GET 요청을 보내면 {"message": "Hello, World!"}라는 JSON 응답을 받게 됩니다.

1.3. 경로 매개변수(Path Parameters)

GET 요청은 경로 매개변수를 통해 특정 데이터를 요청할 수 있습니다. 예를 들어, 사용자 ID에 따라 사용자의 정보를 가져오고 싶다면 다음과 같이 작성할 수 있습니다.

@app.get("/users/{user_id}")
def read_user(user_id: int):
    return {"user_id": user_id, "name": "John Doe"}

위의 예에서 '/users/1'로 GET 요청을 보내면 {"user_id": 1, "name": "John Doe"}라는 응답을 받게 됩니다.

1.4. 쿼리 매개변수(Query Parameters)

@app.get("/items/")
def read_item(skip: int=0, limit: int=10):
    return {"skip": skip, "limit": limit}

위의 예에서 '/items/?skip=5&limit=20'로 GET 요청을 보내면 {"skip": 5, "limit": 20}라는 응답을 받습니다.

'?'뒤에 파라미터를 적을 수 있어요


2. Post

2.1. 개념 설명

클라이언트가 서버에 데이터를 전송할 때 사용되는 HTTP 메서드 중 하나입니다. 주로 서버에 새로운 데이터를 생성하거나 서버의 상태를 변경할 때 사용됩니다. POST 요청은 데이터를 요청 본문(body)에 담아서 전송하므로, URL에 데이터를 노출하지 않습니다.

장점

  • 보안성
  • 대용량 데이터 전송
  • 서버 상태 변경 작업에 적합
  • 다양한 데이터 형식 지원(Json, XML, 등)

단점

  • 캐싱 불가
  • 디버깅 어려움
  • 전송 속도
  • 중복 요청 문제

2.2. 예시 코드

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

# 데이터 모델 정의
class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

# POST 요청을 처리하는 엔드포인트
@app.post("/items/")
def create_item(item: Item):
    if item.price <= 0:
        raise HTTPException(status_code=400, detail="Price must be greater than zero")

    # 실제로는 데이터베이스에 아이템을 저장하는 코드가 여기에 들어감
    return {"message": "Item created successfully", "item": item}

코드 설명

  1. pydantic을 이용해 먼저 데이터의 타입을 정의한다
  2. @app.post() 데코레이터를 사용한다.
  3. 함수의 인자로 pydantic로 만든 타입을 받는다.

 

2.3. post 요청 보내기

html 예시

<form action="https://localhost:8000/items/" method="post">
  <label for="name">Name:</label>
  <input type="text" id="name" name="name" required>
  <label for="price">Price:</label>
  <input type="number" step="0.01" id="price" name="price" required>
  <label for="is_offer">Is Offer:</label>
  <input type="checkbox" id="is_offer" name="is_offer">
  <button type="submit">Submit</button>
</form>

 

bash 예시

curl -X POST https://localhost:8000/items/ -H "Content-Type: application/json" -d '{"name": "Laptop", "price": 999.99, "is_offer": true}'

 

javascript 예시

import axios from 'axios';

axios.post('https://localhost:8000/items', {
    name: 'Laptop',
    price: 999.99,
    is_offer: true
});

 

python 예시

import requests

url = 'https://localhost:8000/items'
data = {
    'name': 'Laptop',
    'price': 999.99,
    'is_offer': True
}

requests.post(url, json=data)
반응형