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 |
댓글