Spring

RestTemplateで例外発生時にHTTPステータスコードやレスポンスボディを取得する方法

RestTemplateでAPIを呼び出した際、HTTPステータスコード4xx5xx(不明なHTTPステータスコードも含む)が返ると例外が発生します。その際、HTTPステータスコードやレスポンスボディを取得する方法をメモしておきます。

RestClientResponseExceptionの情報を取得すればOK

RestTemplateで例外が発生した場合、RestClientExceptionが発生します。RestClientExceptionをたどると、以下のサブクラスが存在します。

RestClientException (RestTemplateが投げる例外のベースとなるクラス)
├── RestClientResponseException (HTTPレスポンスデータを含む例外のベースとなるクラス)
│   ├── HttpStatusCodeException (ステータスコードに基づく例外の抽象クラス)
│ │ ├── HttpClientErrorException (4xx系のステータスコードを受信したとき)
│   │ └── HttpServerErrorException (5xx系のステータスコードを受信したとき)
│ └── UnknownHttpStatusCodeException (不明なステータスコードを受信したとき)
└── ResourceAccessException (I/Oエラーが発生したとき)
view raw command hosted with ❤ by GitHub

今回は、HTTPステータスコードやレスポンスボディなどといったHTTPレスポンスデータを取得したいので、RestClientResponseExceptionを使います。

具体的には、RestTemplateを使う際、RestClientResponseExceptioncatchしてやればOKです。

try {
Response response = restTemplate.getForObject("http://localhost:8080/error", Response.class);
} catch(RestClientResponseException exception) {
exception.getRawStatusCode(); // HTTPステータスコード
exception.getResponseHeaders(); // レスポンスヘッダ
exception.getResponseBodyAsString(); // レスポンスボディ
}
view raw Demo.java hosted with ❤ by GitHub

まとめ

RestTemplateで例外発生時にHTTPステータスコードやレスポンスボディを取得する方法でした。

参考リンク

-Spring

S