본문 바로가기
DevOps/Data Lake

Python FastAPI - RestAPI

by SeleniumBindingProtein 2023. 1. 16.
728x90
반응형

RESTAPI

  • Representational state transfer 약자
  • 네트워크를 통한 클라이언트 및 서버 통신의 패턴을 정의하는 소프트웨어 아키텍처
  • Rest 아키텍쳐 제약 조건
    • Stateless : 서버는 클라이언트의 요청 사이에 어떤 상태도 유지하지 않음
    • 클라이언트-서버 : 클라이언트와 서버는 서로 분리되어 각자가 독립적으로 개발할 수 있어야 함
    • 캐시 가능 : 서버에서 검색된 데이터는 클라이언트 또는 서버에서 캐시가 가능해야 함
    • 균일한 인터페이스 : 서버는 표현을 정의하지 않고, 리소스에 액세스하기 위한 균일한 인터페이스 제공해야 함
    • 계층화된 시스템 : 클라이언트는 프록시 또는 로드 밸러스와 같은 다른 계층을 통해 간접적으로 서버의 리소스에 액세스할 수 있음
  • 리소스는 RestAPI에 대한 HTTP 요청으로 액세스하고 조작할 수 있는 웹서비스에서 사용 가능한 모든 데이터
  • HTTP 방식
    • GET : 기존 리소스를 검색함
    • POST : 새 리소스를 만듬
    • PUT : 기존 리소스를 업데이트함
    • PATCH : 기존 리소스를 부분적으로 업데이트 함
    • DELETE : 리소스를 삭제함
  • 상태 코드 : RestAPI가 HTTP 요청을 수신하고 처리하면 HTTP 응답을 반환함
    • 2xx 성공, 3xx 리디렉션, 4xx 클라이언트 오류, 5xx 서버 오류 
    • 200 : 요청한 작업 성공
    • 201 : 새 리소스 생성
    • 202 : 요청을 받았지만 아직 수정되지 않음
    • 204 : 요청이 성공했지만, 응답에 내용이 없음
    • 400 : 요청 형식이 잘못됨
    • 401 : 클라이언트는 요청된 작업을 수행할 권한이 없음
    • 404 : 요청한 리소스를 찾을 수 없음
    • 415 : 요청 데이터 형식이 서버에서 지원되지 않음
    • 422 : 요청 데이터의 형식이 올바르지만, 유효하지 않거나 누락된 데이터가 포함됨
    • 500 : 요청을 처리할 때 서버에서 오류가 발생했음

Python은 requests  라이브러리 사용

  • $ python -m pip install requests
# GET
import requests
api_url = "http://IP:PORT/todos/1"
response = requests.get(api_url)
# https:// 의 경우, HTTPS 요청에 대한 SSL 인증서 확인 오류가 발생할 수 있음
# api_url = "https://IP:PORT/todos/1"
# 해당 옵션을 사용하면 HTTPS 요청에 대한 SSL 인증서 확인 과정을 생략하겠다는 의미임
# response = requests.get(api_url, verify=False)
response.json()
{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}

# POST
import requests
api_url = "http://IP:PORT/todos"
todo = {"userId": 1, "title": "Buy milk", "completed": False}
headers =  {"Content-Type":"application/json"}
response = requests.post(api_url, data=json.dumps(todo), headers=headers)
response.json()
{'userId': 1, 'title': 'Buy milk', 'completed': False, 'id': 201}

# PUT
import requests
api_url = "http://IP:PORT/todos/10"
response = requests.get(api_url)
response.json()
{'userId': 1, 'id': 10, 'title': 'illo est ... aut', 'completed': True}

todo = {"userId": 1, "title": "Wash car", "completed": True}
response = requests.put(api_url, json=todo)
response.json()
{'userId': 1, 'title': 'Wash car', 'completed': True, 'id': 10}

# PATCH
import requests
api_url = "http://IP:PORT/todos/10"
todo = {"title": "Mow lawn"}
response = requests.patch(api_url, json=todo)
response.json()
{'userId': 1, 'id': 10, 'title': 'Mow lawn', 'completed': True}

# DELETE
import requests
api_url = "http://IP:PORT/todos/10"
response = requests.delete(api_url)
response.json()

FastAPI

  • FastAPI는 API 구축에 최적화된 Python 웹 프레임워크
  • 비동기 형식
  • fastAPI 설치를 통해 애플리케이션 사용
    • $ python -m pip install fastapi
  • fastAPI 애플리케이션을 실행할 수 있는 서버 설치
    • $ python -m pip install uvicorn[standard]
  • 서버 실행
    • $ uvicorn main:app --reload --host=0.0.0.0 --port=8080
# main.py
from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()

def _find_next_id():
    return max(person.person_id for person in people) + 1

class Person(BaseModel):
    person_id: int = Field(default_factory=_find_next_id, alias="id")
    name: str
    sex: str
    contry: int
    
people = [
    Person(id=1, name="Oli", contry="Bangkok", sex="F"),
    Person(id=2, name="Asus", contry="Canberra", sex="M"),
    Person(id=3, name="Endy", contry="Cairo", sex="M"),
]

@app.get("/person")
async def get_people():
    return people
    
    
@app.post("/people", status_code=201)
async def add_person(person: Person):
    people.append(person)
    return person
728x90
반응형

'DevOps > Data Lake' 카테고리의 다른 글

nifi-api  (2) 2023.01.16
Python FastAPI - restAPI를 활용한 mssql 연동  (0) 2023.01.16
Python_FastAPI : MSSQL 연동  (0) 2023.01.10
Data Lake 개념정리  (0) 2022.04.05

댓글