코드로 우주평화

requests _ response 상태에 따라 raise를 할 수 있다? 본문

나는 이렇게 학습한다/Library

requests _ response 상태에 따라 raise를 할 수 있다?

daco2020 2022. 10. 18. 18:21
반응형

외부 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 메서드의 소스코드를 함께 첨부한다. 소스코드를 보면 더 이해하기 쉬울 것이다.

상태 코드 400 ~ 500 미만은 'Client Error', 500 ~ 600 미만은 'Server Error'라고 명시하고 있는 점이 흥미롭다





반응형