현대 웹 애플리케이션 개발에서 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}")
✅ 실행 흐름
requests.get()
메서드를 사용해 HTTP GET 요청을 보냄.- 응답이
200 OK
라면 JSON 데이터를 출력. - 오류 발생 시 상태 코드를 출력.
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 클라이언트를 직접 활용해 보세요! 🚀
'프로그래밍 > Python' 카테고리의 다른 글
Python 웹 개발: Django 완벽 가이드 (0) | 2025.02.28 |
---|---|
Python 웹 개발: Flask 완벽 가이드 (0) | 2025.02.28 |
네트워킹 기초: Python 소켓 프로그래밍 완벽 가이드 (0) | 2025.02.28 |
Python ORM 완벽 가이드: SQLAlchemy를 활용한 데이터베이스 처리 (0) | 2025.02.27 |
SQLite 완벽 가이드: Python과 함께하는 경량 데이터베이스 활용법 (0) | 2025.02.27 |