파이썬으로 API 호출하기

2026. 6. 16. 07:30·Programming/API

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
'Programming/API' 카테고리의 다른 글
  • API를 활용한 데이터 자동 수집 파이프라인
  • 실전에서 API 안정적으로 쓰기
  • API의 개념
데이터로 읽는 생명
데이터로 읽는 생명
is-note 님의 블로그 입니다.
  • 데이터로 읽는 생명
    In Silico Note
    데이터로 읽는 생명
  • 전체
    오늘
    어제
    • 분류 전체보기 (190)
      • Bio-Knowledge (16)
        • 분자생물학 & 유전학 기초 (0)
        • 전사체학 & 유전자 발현 (0)
        • 구조생물학 & 단백질 (0)
        • 싱글셀 & 다중오믹스 (0)
        • 임상유전학 & 질환 데이터 (0)
      • Programming (4)
        • API (4)
      • BI&Programming-Tools (111)
        • File Formats (14)
        • Linux & Bash Script (38)
        • Python (35)
        • R (11)
        • 통계 (8)
        • Pipeline Manager (0)
        • Etc (5)
      • Bio Data Analysis (28)
        • 서열분석개론 (6)
        • WGS(Whole Genome Seq) (11)
        • WES(Whole Exome Seq) (2)
        • RNA-Seq (4)
        • Metagenome (2)
        • Non-human Resequencing (1)
        • 임상유전체 분석 (1)
        • Multi-Omics (1)
      • Bio-Trends & Tech (1)
      • 코딩테스트 연습 (30)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리눅스기초
    유전체분석
    분자생물학
    코딩테스트
    파이썬연습
    fasta
    생물정보학
    R기초
    파일포맷
    통계
    FASTQ
    데이터분석
    bioinformatics
    R
    wgs
    리눅스
    파이썬
    파이썬기초
    GATK
    ngs
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데이터로 읽는 생명
파이썬으로 API 호출하기
상단으로

티스토리툴바