import requests
import time
def make_api_request(url, options, max_retries=3):
retries = 0
while retries < max_retries:
try:
response = requests.request(options.get('method', 'GET'), url, **options)
if response.ok:
return response.json()
error_data = response.json()
error = error_data.get('error', {})
# 특정 오류 유형 처리
if response.status_code == 429:
retry_after = error.get('retry_after', 2 ** retries)
print(f"요청 제한됨. {retry_after}초 후 재시도...")
time.sleep(retry_after)
retries += 1
continue
if response.status_code >= 500:
# 서버 오류, 백오프로 재시도
backoff_time = 2 ** retries
print(f"서버 오류. {backoff_time}초 후 재시도...")
time.sleep(backoff_time)
retries += 1
continue
# 클라이언트 오류, 재시도하지 않음
print(f"API 오류: {error.get('message')}")
raise Exception(error.get('message'))
except requests.exceptions.RequestException as e:
# 네트워크 오류, 백오프로 재시도
if retries == max_retries - 1:
raise e
backoff_time = 2 ** retries
print(f"요청 실패: {str(e)}. {backoff_time}초 후 재시도...")
time.sleep(backoff_time)
retries += 1
raise Exception("최대 재시도 횟수 도달")