2023년 6월 업데이트
안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출을 진행토록 하겠습니다.
SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록
코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.
예를 들어, 16_api_call.py를 생성하고 코드를 실행합니다.
TL;DR
웹서비스 API 호출을 소개하며, HTTP GET/POST 방식에 대한 설명과 코드를 살펴봅니다. API 호출시 리턴되는 JSON 구조를 리뷰하고 코드로 처리하는 방법에 대해 예제 확인합니다.
Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출
웹서비스란 무엇인가요?
다른 웹서버나 웹서비스에서 호스팅 되는 애플리케이션을 Python으로 호출할 수 있습니다.
수많은 웹서비스가 존재하고, Python에서 손쉽게 이 서비스들을 가져다 사용할 수 있습니다.
이번 강좌에서는 전형적인 웹서비스인, IPAPI의 웹서비스와 httpbin을 호출해 보도록 하겠습니다. 늘 이야기하지만, 다른 서비스의 호출방식도 비슷합니다. 이 예제를 마치고 나면, 다른 웹서비스도 관련 문서를 통해 호출할 수 있을 것입니다.
그렇다면, 웹서비스의 API란 무엇인가?
대부분의 웹서비스에서는 코드로 호출할 수 있는 여러 API가 제공됩니다. 우리가 사용할 IPAPI의 웹서비스와 httpbin에도 앱과 웹사이트에 여러 기능이나 데이터를 추가하기 위해, 코드로 호출할 수 있는 여러 API가 제공됩니다.
우리는 이 강좌에서, 코드 예제를 통해 IPAPI의 웹서비스에서 제공하는 IP 정보 조회 기능과 http request를 그대로 response 하여 개발/테스트 시 유용한 httpbin을 호출할 것입니다.
API를 호출하기 위한 준비사항
IPAPI의 경우 테스트나 개발 목적에서 사용할 경우 호출 조건이 까다롭지 않습니다. 하루 동안 1천 건까지 호출은 무료이며, 대부분의 서비스 제공자가 다른 가격 정책을 가지고 있습니다. 일반적으로 아래 정보가 필요합니다.
- API 키가 있어야 API 호출이 가능
- 서비스의 address(주소) 또는 endpoint(끝점)
- API 문서에서 제공하는 호출 할 메서드의 함수 이름
- API 문서에서 제공하는 함수의 파라미터 정보
- API 문서에서 제공하는 나열된 HTTP 헤더 정보
이런 정보들이 필요합니다. 차근차근 강좌에서 준비하니 걱정 안 하셔도 됩니다.
API 키는 무엇인가요?
이 API키는 해당 웹서비스에서 발급한 인증키이고, 고유한 값입니다.
IPAPI처럼 테스트 목적으로 몇 건 요청할 경우는 그냥도 사용한 경우가 있지만, 대부분의 경우 이렇게 웹서비스 API를 이용하기 위해서는 서비스 제공자가 발급한 키를 보통 발급받은 후에 접근 가능합니다.
API를 호출하기 위한 HTTP 호출 "방식"
우리의 코드는 python의 "requests" 패키지를 이용해 IPAPI의 경우 HTTP "GET" 방식으로, httpbin의 경우 HTTP "POST 방식"으로 API를 호출합니다.
GET 방식과 POST 방식에 대해서는 아래 내용을 참조하세요.
☑️ 챗GPT 활용: HTTP GET 방식과 POST 방식, 다른 Verb에 대해서도 알려줘
Python의 requests 패키지 라이브러리
복잡하게 고민할 필요 없습니다. 우리가 오늘 사용할 requests 패키지를 이용하면, 손쉬운 HTTP 요청과 응답 처리가 가능합니다.
Web API 호출을 위해 requests 패키지 설치
지난 강좌에서 배운 대로, pip 명령을 이용해 패키지를 python 환경에 설치합니다.
# WSL이나 리눅스일 경우 bash shell에서, 윈도일 경우 명령프롬프트에서 실행합니다. pip install requests
(주의, conda environment를 사용 중이면, 현재 conda environment가 activate 되었는지 다시 확인하시고, pip로 패키지를 추가할 때도, activate 된 conda environment에서 설치해야 정상적으로 동작합니다. 참조링크: 개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 1. Python 개발 환경 구성 )
IPAPI 서비스 요청과 응답 확인
IPAPI를 테스트하기 위해 브라우저에서 https://ipapi.co/json 접근합니다. 그러면, JSON 포맷으로 IP 정보가 보입니다.
이렇게 브라우저 주소창에서 요청하는 방식이 HTTP GET 방식과 같으며 아래 코드로 요청해 프로그래밍적으로 처리가 가능합니다.
# 이 코드에서는 Python으로 손쉽게 IPAPI를 호출합니다. # requests 라이브러리를 사용하여 Python에서 간단하게 REST API 호출을 진행합니다. import requests # 웹 서비스의 응답(Response)을 처리하려면 json 라이브러리가 필요합니다. import json # 호출하려는 API 함수의 이름을 주소에 추가합니다. service_address = "https://ipapi.co/json" # HTTP GET 방식으로 함수를 호출합니다. response = requests.get(service_address) # HTTP 호출에서 오류가 생기면, 예외를 발생시킵니다. response.raise_for_status() # 리턴 받은 JSON 결과를 출력합니다. results = response.json() print(json.dumps(results))
호출이 완료되면 아래 결과를 보실 수 있습니다.
이렇게 호출하여 얻은 API 결과를 Python에서 원하는 형태로 출력하거나 변환해 이용할 수 있습니다.
출력된 JSON 결과를 정돈된 형태로 보려면, pprint로 출력하거나 Online JSON Viewer (stack.hu)과 같은 JSON linting 서비스에 결과를 붙어 넣고 "Format"을 누르거나 viewer 탭에서 더 prettify 된 결과를 확인 가능합니다.
(옵션) HTTP POST "httpbin" 요청 테스트
이 POST request는 옵션이기 때문에 원하시는 분만 진행하시면 됩니다.
httpbinAPI 호출 코드를 실행합니다
httpbin은 HTTP request 내용을 그대로 response로 리턴해 HTTP 요청 테스트 시 유용합니다.
아래와 같이 call_api.py 코드를 실행합니다.
# requests 라이브러리를 사용하여 Python에서 간단하게 REST API 호출을 진행합니다. import requests # 웹 서비스의 응답(Response)을 처리하려면 json 라이브러리가 필요합니다. import json # Lint 된 출력 표시 import pprint # 호출하려는 API 함수의 이름을 주소에 추가합니다. # 개발/테스트 목적으로 사용되는 httpbin.org 서비스를 이용합니다. # HTTP request 내용을 그대로 response로 리턴해 HTTP 요청 테스트 시 유용합니다. address = "https://httpbin.org/post" # HTTP POST 요청에 추가할 파라미터입니다. parameters = {'sqler_test_key':'key', 'language':'ko'} # HTTP POST에 요청할 헤더 정보입니다. headers = {'accept':'application/json'} # HTTP POST 방식으로 함수를 호출합니다. response = requests.post(address, headers=headers, params=parameters) # HTTP 호출에서 오류가 생기면, 예외를 발생시킵니다. response.raise_for_status() # 리턴 받은 JSON 결과를 출력합니다. results = response.json() pprint.pprint(results)
HTTP POST 요청을 실행하면 이런 결과가 출력되는 것을 보실 수 있습니다.
python call_api.py ===실행결과=== {'args': {'language': 'ko', 'sqler_test_key': 'key'}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-648d8056-7893235704bbc12c121d954c'}, 'json': None, 'origin': '20.196.211.249', 'url': 'https://httpbin.org/post?sqler_test_key=key&language=ko'}
HTTP request에 사용한 파라미터 정보 등이 response에 리턴됩니다.
수고 많으셨습니다.
출력된 결과인 JSON 포맷에 대한 다양한 처리는 다음 강좌에서 결과와 함께 상세히 소개해 드리겠습니다.
파이썬 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터
참조링크
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝