中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

RestTemplate自定義請求失敗異常如何處理

發布時間:2022-03-17 13:31:20 來源:億速云 閱讀:741 作者:iii 欄目:開發技術

今天小編給大家分享一下RestTemplate自定義請求失敗異常如何處理的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、異常現象

在使用RestTemplate進行遠程接口服務調用的時候,當請求的服務出現異常:超時、服務不存在等情況的時候(響應狀態非200、而是400、500HTTP狀態碼),就會拋出如下異常:

RestTemplate自定義請求失敗異常如何處理

該異常我是模擬出來的,將正確的請求服務地址由“/posts/1”改成“/postss/1”。服務不存在所以拋出404異常。

@Test
public void testEntity() {
   String url = "http://jsonplaceholder.typicode.com/postss/1";
   ResponseEntity<String> responseEntity
               = restTemplate.getForEntity(url, String.class);  //這行拋出異常
   //下面兩行代碼執行不到
   HttpStatus statusCode = responseEntity.getStatusCode(); // 獲取響應碼
   System.out.println("HTTP 響應狀態:" + statusCode);
}

異常拋出之后,程序后面的代碼就執行不到了,無法進行后面的代碼執行。實際的業務開發中,有的時候我們更期望的結果是:不管你服務端是超時了還是服務不存在,我們都應該獲得最終的請求結果(HTTP請求結果狀態400、500),而不是獲得一個拋出的異常。

二、源碼解析-默認實現

首先我要說一個結論:RestTemplate請求結果異常是可以自定義處理的。在開始進行自定義的異常處理邏輯之前,我們有必要看一下異常處理的默認實現。也就是:為什么會產生上面小節提到的現象?

ResponseErrorHandler是RestTemplate請求結果的異常處理器接口

  • 接口的第一個方法hasError用于判斷HttpResponse是否是異常響應(通過狀態碼)

  • 接口的第二個方法handleError用于處理異常響應結果(非200狀態碼段)

DefaultResponseErrorHandler是ResponseErrorHandler的默認實現

所以我們就來看看DefaultResponseErrorHandler是如何來處理異常響應的?從HttpResponse解析出Http StatusCode,如果狀態碼StatusCode為null,就拋出UnknownHttpStatusCodeException異常。

RestTemplate自定義請求失敗異常如何處理

如果StatusCode存在,則解析出StatusCode的series,也就是狀態碼段(除了200段,其他全是異常狀態碼),解析規則是StatusCode/100取整。

public enum Series {
   INFORMATIONAL(1),  // 1xx/100
   SUCCESSFUL(2),  // 2xx/100
   REDIRECTION(3), // 3xx/100
   CLIENT_ERROR(4), // 4xx/100   ,客戶端異常
   SERVER_ERROR(5); // 5xx/100 ,服務端異常
}

進一步針對客戶端異常和服務端異常進行處理,處理的方法是拋出HttpClientErrorException。也就是第一小節出現的異常的原因

RestTemplate自定義請求失敗異常如何處理

三、RestTemplate自定義異常處理

所以我們要實現自定義異常,實現ResponseErrorHandler 接口就可以。

public class MyRestErrorHandler implements ResponseErrorHandler {
    /**
     * 判斷返回結果response是否是異常結果
     * 主要是去檢查response 的HTTP Status
     * 仿造DefaultResponseErrorHandler實現即可
     */
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        int rawStatusCode = response.getRawStatusCode();
        HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
        return (statusCode != null ? statusCode.isError(): hasError(rawStatusCode));
    }
    protected boolean hasError(int unknownStatusCode) {
        HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode);
        return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR);
    }
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // 里面可以實現你自己遇到了Error進行合理的處理
        //TODO 將接口請求的異常信息持久化
    }
}

將MyRestErrorHandler 在RestTemplate實例化的時候進行注冊。

參考:

RestTemplate在Spring或非Spring環境下使用精講

RestTemplate實現多種底層HTTP客戶端類庫的切換用法

RestTemplate自定義請求失敗異常如何處理

這時再去執行第一小節中的示例代碼,就不會拋出異常。而是得到一個HTTP Status 404的結果。我們可以根據這個結果,在程序中繼續向下執行代碼。

RestTemplate自定義請求失敗異常如何處理

以上就是“RestTemplate自定義請求失敗異常如何處理”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴业县| 彰武县| 正定县| 泰州市| 南乐县| 仪征市| 苍南县| 印江| 凤冈县| 诸暨市| 堆龙德庆县| 和顺县| 武威市| 兴安盟| 康乐县| 营口市| 涟水县| 凭祥市| 寿阳县| 开鲁县| 湖口县| 福泉市| 营山县| 雷州市| 宜都市| 巩义市| 成武县| 崇明县| 永修县| 库尔勒市| 崇左市| 镇平县| 左权县| 苗栗县| 双柏县| 泰宁县| 丰城市| 繁峙县| 岳普湖县| 濉溪县| 衡东县|