코드로 우주평화
requests _ response 상태에 따라 raise를 할 수 있다? 본문
외부 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 에 대해 더 자세히 알고 싶다면 아래 공식문서를 참고하길 바란다.
추가로 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 |