프로그래밍/Python

Python HTTP 클라이언트 완벽 가이드: `requests` 라이브러리를 활용한 API 통신

shimdh 2025. 2. 28. 09:17
728x90

현대 웹 애플리케이션 개발에서 HTTP 클라이언트는 필수적인 요소입니다. 웹 서비스와 데이터를 주고받거나 API와 통신하는 과정에서 HTTP 요청을 다룰 수 있어야 합니다. Python에서는 requests 라이브러리를 활용하여 손쉽게 HTTP 요청을 보내고 응답을 처리할 수 있습니다.

이번 글에서는 HTTP 프로토콜 개념, Python에서의 HTTP 요청 처리, API 연동 기법, 예외 처리 및 실전 활용 사례까지 자세히 살펴보겠습니다.


1. HTTP 프로토콜 이해하기

🔹 HTTP란?

HTTP(Hypertext Transfer Protocol)웹에서 데이터를 주고받는 기본적인 통신 프로토콜입니다. 클라이언트(예: 웹 브라우저, 모바일 앱, 서버)가 서버에 요청을 보내고, 서버가 이에 대한 응답을 반환하는 방식으로 동작합니다.

🔹 HTTP 요청(Request)과 응답(Response)의 구조

✅ 요청(Request)

  • 클라이언트가 서버에 특정 작업을 수행해달라고 요청하는 메시지.
  • 주요 HTTP 메서드:
    • GET: 데이터를 요청.
    • POST: 새로운 데이터를 생성.
    • PUT: 기존 데이터를 수정.
    • DELETE: 데이터를 삭제.

✅ 응답(Response)

  • 서버가 클라이언트의 요청을 처리한 후 반환하는 메시지.
  • HTTP 상태 코드:
    • 200 OK: 요청 성공.
    • 201 Created: 데이터 생성 완료.
    • 400 Bad Request: 잘못된 요청.
    • 401 Unauthorized: 인증 실패.
    • 404 Not Found: 요청한 리소스를 찾을 수 없음.
    • 500 Internal Server Error: 서버 오류.

2. Python에서 HTTP 클라이언트 사용하기

Python에서는 requests 라이브러리를 사용하여 간단하게 HTTP 요청을 보낼 수 있습니다.

🔹 requests 라이브러리 설치

pip install requests

🔹 기본적인 GET 요청

import requests

response = requests.get('https://api.example.com/data')

if response.status_code == 200:
    data = response.json()  # JSON 형식의 데이터 변환
    print(data)
else:
    print(f"Error: {response.status_code}")

✅ 실행 흐름

  1. requests.get() 메서드를 사용해 HTTP GET 요청을 보냄.
  2. 응답이 200 OK라면 JSON 데이터를 출력.
  3. 오류 발생 시 상태 코드를 출력.

3. 다양한 HTTP 요청 방식

🔹 POST 요청 (데이터 생성)

import requests

url = 'https://api.example.com/data'
payload = {'name': 'Alice', 'age': 30}

response = requests.post(url, json=payload)

if response.status_code == 201:
    print("Data created successfully!")
else:
    print(f"Error: {response.status_code}")

✅ 주요 포인트

  • json=payload를 사용하면 자동으로 JSON 데이터가 전송됨.
  • status_code == 201이면 데이터가 성공적으로 생성된 것.

🔹 PUT 요청 (데이터 수정)

url = 'https://api.example.com/data/1'  # ID 1번 데이터 수정
payload = {'name': 'Alice', 'age': 32}

response = requests.put(url, json=payload)

if response.status_code == 200:
    print("Data updated successfully!")

✅ PUT은 기존 데이터를 수정할 때 사용하며, 요청 본문에 업데이트할 데이터를 포함해야 함.


🔹 DELETE 요청 (데이터 삭제)

url = 'https://api.example.com/data/1'  # ID 1번 데이터 삭제

response = requests.delete(url)

if response.status_code == 204:
    print("Data deleted successfully!")

✅ DELETE 요청이 성공하면 보통 204 No Content 상태 코드가 반환됨.


4. HTTP 요청 시 추가 기능

🔹 1) 요청 헤더(Header) 설정

API 호출 시 인증 토큰이나 메타데이터를 포함해야 하는 경우 헤더를 설정할 수 있습니다.

headers = {
    'Authorization': 'Bearer your_token_here',
    'User-Agent': 'MyApp/1.0'
}

response = requests.get('https://api.example.com/protected-data', headers=headers)
  • Authorization: API 인증을 위한 토큰.
  • User-Agent: 클라이언트 정보 제공.

🔹 2) URL 쿼리 매개변수(Query Params) 사용

URL 뒤에 ?key=value 형식으로 필터링된 데이터를 요청할 수 있습니다.

params = {'search': 'Python', 'limit': 5}
response = requests.get('https://api.example.com/search', params=params)
print(response.json())
  • search=Python → 검색어 지정.
  • limit=5 → 최대 5개 결과만 반환.

🔹 3) 요청 타임아웃 설정 (네트워크 지연 대비)

네트워크 지연이나 서버 응답이 느릴 경우, timeout을 설정하여 요청이 일정 시간 안에 완료되지 않으면 자동 취소되도록 설정할 수 있습니다.

try:
    response = requests.get('https://api.example.com/data', timeout=5)
except requests.exceptions.Timeout:
    print("요청 시간이 초과되었습니다!")

timeout=5를 설정하면 5초 내에 응답이 없으면 예외 발생.


5. 예외 처리 및 오류 대응

네트워크 통신에서는 다양한 예외 상황이 발생할 수 있으므로, 예외 처리를 추가하여 코드의 안정성을 높이는 것이 중요합니다.

try:
    response = requests.get('https://api.example.com/data')
    response.raise_for_status()  # HTTP 오류 발생 시 예외 발생

    data = response.json()
    print(data)

except requests.exceptions.HTTPError as err:
    print(f"HTTP 오류 발생: {err}") 

except requests.exceptions.ConnectionError:
    print("서버 연결 실패!")

except requests.exceptions.Timeout:
    print("요청 시간이 초과되었습니다!")

except requests.exceptions.RequestException as err:
    print(f"요청 실패: {err}")

✅ 예외 처리 종류

  • HTTPError: HTTP 응답 오류 (404 Not Found, 500 Internal Server Error 등).
  • ConnectionError: 네트워크 연결 실패.
  • Timeout: 요청 시간이 초과됨.
  • RequestException: 모든 종류의 예외를 포괄.

🔥 결론: Python HTTP 클라이언트로 쉽고 강력한 API 통신 구현

Python의 requests 라이브러리를 활용하면 HTTP 요청을 간편하게 다룰 수 있으며, 다양한 API와 쉽게 연동할 수 있습니다.

🎯 핵심 정리

  • HTTP는 웹에서 데이터를 주고받는 핵심 프로토콜.
  • GET, POST, PUT, DELETE 등의 HTTP 메서드를 활용하여 데이터를 송수신 가능.
  • 요청 헤더, 쿼리 매개변수, 타임아웃 등의 추가 설정을 통해 보다 정교한 요청 가능.
  • 예외 처리를 통해 네트워크 오류 대응 및 코드 안정성을 강화할 수 있음.

이제 실전에서 다양한 API와 연동하여 HTTP 클라이언트를 직접 활용해 보세요! 🚀

728x90