외부 API로부터 받은 응답 값이 정상이 아니라면
우리는 응답이 잘못되었음을 어떻게 확인할 수 있을까? 매번 요청 때마다 응답의 상태 코드를 일일이 체크하고 핸들링해야 할까?
python의 requests 라이브러리에서는 이러한 번거로움을 줄이기 위해 raise_for_status() 메서드가 있다.
raise_for_status()는 응답의 상태 코드가 400 이상인 경우 HTTPError를 raise 한다. raise 를 통해 외부 모듈과의 통신상태를 확인하고 쉽게 핸들링을 할 수 있다.
사용법은 간단하다.
requests 요청으로 응답받은 res 객체로부터 raise_for_status() 메서드를 호출하면 된다.
url = "<http://localhost:8000/no-api>"
res = requests.post(url)
res.raise_for_status()
해당 코드를 실행해보면 다음의 결과를 얻는다.
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: <http://localhost:8000/no-api>
현재 로컬 서버에는 no-api라는 엔드포인트가 없기 때문에 404 Not Found라는 메시지를 raise 한다.
여기서 주의할 점
raise_for_status()는 응답받은 내용을 raise 할 뿐, 본 서버의 응답까지 대신해주는 것은 아니다.
즉, 위의 404 Not Found는 에러 메시지일 뿐이고, 실제 사용자가 본 서버로부터 받는 응답은 500 Internal Server Error가 된다.
때문에 500 에러를 사용자에게 보내고 싶지 않다면 raise 된 HTTPError를 직접 핸들링해주는 과정이 필요하다.
HTTPError를 핸들링하자.
try ~ except로 HTTPError 를 ValueError로 바꾸어 보겠다. (API 반환시에는 response로 바꾸어주면 된다)
try:
url = "<http://localhost:8000/money>"
res = requests.get(url)
res.raise_for_status()
print(f"ok ... {res.json()}")
except requests.HTTPError as exc:
raise ValueError(f"fail ... {exc}")
url의 마지막 부분인 /money를 주목하자.
만약 /money라는 엔드포인트가 존재하고 응답의 상태 코드가 400 미만이라면 "ok … " 문구와 함께 가져온 값을 출력할 것이다.
반대로 400 이상의 응답을 받는다면 "fail … " 문구와 함께 ValueError 로 raise 될 것이다.
과연 실행 결과는?
ok ... 1,000,000,000,000원
다행히 /money 엔드포인트는 존재했고 ‘1조’라는 어마 무시한 돈을 응답받았다. (야호~!)
그럼 이번에는 /money를 /girlfriend를 바꿔보자.
url = "<http://localhost:8000/girlfriend>"
실행 결과는? (두근두근..!)
ValueError: fail ... 404 Client Error: Not Found for url: <http://localhost:8000/girlfriend>
/girlfriend 엔드포인트는 아직 구현이 안되었는지 Not Found라고 한다… ㅜㅜ
그래도 다행인것은 HTTPError 가 ValueError 로 바뀌어 raise 되었다!
raise_for_status 에 대해 더 자세히 알고 싶다면 아래 공식문서를 참고하길 바란다.
Quickstart — Requests 2.28.1 documentation
Eager to get started? This page gives a good introduction in how to get started with Requests. Let’s get started with some simple examples. Passing Parameters In URLs You often want to send some sort of data in the URL’s query string. If you were const
requests.readthedocs.io
추가로 raise_for_status 메서드의 소스코드를 함께 첨부한다. 소스코드를 보면 더 이해하기 쉬울 것이다.
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
Pydantic 옵션 하나로 ORM 을 DTO 모델로 변환하기 (0) | 2023.08.22 |
---|---|
Pydantic 의 Datetime 타입으로 날짜와 시간을 다뤄보자 (0) | 2023.08.21 |
파이썬으로 해외 증권거래소 개장일/휴장일 확인하는 방법 (0) | 2022.08.30 |
Tenacity _ 예외가 발생한 함수를 다시 실행하려면? (0) | 2022.08.27 |
Click _ argument, option으로 인자 전달하기 (0) | 2022.08.21 |