requests 설치
pip install requests
기본 요청
import requests
# GET — 데이터 조회
response = requests.get("https://api.example.com/users")
print(response.status_code) # 200
print(response.json()) # JSON → dict 변환
print(response.text) # 원시 텍스트
print(response.headers) # 응답 헤더
# POST — 데이터 생성
payload = {"name": "Alice", "email": "alice@example.com"}
response = requests.post("https://api.example.com/users", json=payload)
# PUT — 전체 수정
requests.put("https://api.example.com/users/1", json={"name": "Bob"})
# PATCH — 부분 수정
requests.patch("https://api.example.com/users/1", json={"email": "bob@example.com"})
# DELETE
requests.delete("https://api.example.com/users/1")
파라미터 전달
# 쿼리 파라미터 — URL 뒤에 ?key=value 형태로 붙음
params = {"page": 1, "limit": 20, "sort": "desc"}
response = requests.get("https://api.example.com/posts", params=params)
# 실제 URL: /posts?page=1&limit=20&sort=desc
# JSON 바디 — 복잡한 데이터 전송
payload = {"filters": {"age": {"min": 20, "max": 30}}}
response = requests.post("https://api.example.com/search", json=payload)
# Form 데이터 — HTML form 방식
form_data = {"username": "alice", "password": "secret"}
response = requests.post("https://api.example.com/login", data=form_data)
세션과 헤더 재사용
매 요청마다 헤더를 반복해서 쓰는 게 번거로울 때 씁니다. 연결도 재사용해서 속도도 빠릅니다.
session = requests.Session()
session.headers.update({
"Authorization": "Bearer TOKEN",
"Content-Type": "application/json",
"User-Agent": "MyApp/1.0"
})
# 이후 모든 요청에 헤더 자동 포함
r1 = session.get("https://api.example.com/profile")
r2 = session.get("https://api.example.com/orders")
r3 = session.post("https://api.example.com/logout")
응답 헤더 확인
Rate limit 정보나 콘텐츠 타입 등 응답 헤더에서 유용한 정보를 꺼낼 수 있습니다.
response = requests.get("https://api.example.com/data", headers=headers)
print(response.headers.get("Content-Type"))
print(response.headers.get("X-RateLimit-Remaining")) # 남은 호출 횟수
print(response.headers.get("X-RateLimit-Reset")) # 초기화 시각
파일 업로드 / 다운로드
# 파일 업로드
with open("photo.jpg", "rb") as f:
files = {"file": ("photo.jpg", f, "image/jpeg")}
response = requests.post(
"https://api.example.com/upload",
files=files,
headers={"Authorization": "Bearer TOKEN"}
)
# 파일 + 추가 데이터 함께 전송
with open("report.pdf", "rb") as f:
response = requests.post(
"https://api.example.com/documents",
files={"file": f},
data={"title": "월간 리포트", "category": "finance"}
)
# 대용량 파일 다운로드 — stream=True로 메모리 부담 줄임
response = requests.get("https://example.com/bigfile.zip", stream=True)
with open("bigfile.zip", "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
웹훅 수신 서버
내가 요청하는 게 아니라 외부 서비스가 이벤트 발생 시 내 서버로 쏴주는 방식입니다.
일반 API: 내 코드 → 외부 서버 (내가 물어봄)
웹훅: 외부 서버 → 내 서버 (변화 생기면 알려줌)
from flask import Flask, request, jsonify
import hmac, hashlib
app = Flask(__name__)
WEBHOOK_SECRET = "my_secret_key"
@app.route("/webhook", methods=["POST"])
def webhook():
# 서명 검증 — 신뢰할 수 있는 서버에서 보낸 건지 확인
signature = request.headers.get("X-Hub-Signature-256", "")
body = request.get_data()
expected = "sha256=" + hmac.new(
WEBHOOK_SECRET.encode(), body, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return jsonify({"error": "invalid signature"}), 401
# 이벤트 종류에 따라 처리
event_type = request.headers.get("X-GitHub-Event")
event = request.json
if event_type == "push":
branch = event["ref"].split("/")[-1]
print(f"{branch} 브랜치 푸시 발생")
elif event_type == "pull_request":
print(f"PR #{event['number']} 생성됨")
return jsonify({"status": "ok"}), 200
if __name__ == "__main__":
app.run(port=5000)
웹훅은 서명 검증 안 하면 누구나 내 서버로 요청을 보낼 수 있습니다. 반드시 검증합니다.
'Programming > API' 카테고리의 다른 글
| API를 활용한 데이터 자동 수집 파이프라인 (0) | 2026.06.16 |
|---|---|
| 실전에서 API 안정적으로 쓰기 (0) | 2026.06.16 |
| API의 개념 (0) | 2026.06.16 |
