最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RestTemplate如何獲取HTTP狀態(tài)碼

 更新時間:2026年01月06日 09:21:37   作者:搬甎小犟  
文章介紹了使用RestTemplate請求接口并處理HTTP狀態(tài)碼的方法,為了解決默認處理器拋出異常的問題,建議自定義ResponseErrorHandler,自定義處理器不會拋出異常,從而可以獲取ResponseEntity對象并獲取HTTP狀態(tài)碼

背景

  • 使用RestTemplate請求特定接口,并根據(jù)獲取的HTTP狀態(tài)碼進行具體業(yè)務操作。
@RestController
public class RestfulController {
    private RestTemplate restTemplate = new RestTemplate();

    @GetMapping("/test1")
    public void test1(HttpServletResponse response) {
        response.setStatus(403);
    }

    @GetMapping("/test2")
    public void test2() {
        ResponseEntity responseEntity = restTemplate.exchange("http://127.0.0.1:8080/test1", HttpMethod.GET, new HttpEntity<String>(null, new HttpHeaders()), String.class);
        int code = responseEntity.getStatusCodeValue();
        // 具體業(yè)務操作...
    }
}

報錯

?org.springframework.web.client.HttpClientErrorException$Forbidden: 403 null

解決

  • 如果想要使用responseEntity.getStatusCodeValue()等,需要先為RestTemplate對象設置ResponseErrorHandler。
  • 需要注意代碼并不符合平常的開發(fā)規(guī)范,只是為了實現(xiàn)效果。
@RestController
public class RestfulController {
    private RestTemplate restTemplate = new RestTemplate();

    @GetMapping("/test1")
    public void test1(HttpServletResponse response) {
        response.setStatus(403);
    }

    @GetMapping("/test2")
    public void test2() {
        restTemplate.setErrorHandler(new RestfulController.ErrorHandler());
        ResponseEntity responseEntity = restTemplate.exchange("http://127.0.0.1:8080/test1", HttpMethod.GET, new HttpEntity<String>(null, new HttpHeaders()), String.class);
        int code = responseEntity.getStatusCodeValue();
        // 業(yè)務處理...
    }

    static class ErrorHandler implements ResponseErrorHandler {

        @Override
        public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
            if (200 == clientHttpResponse.getRawStatusCode()) {
                return false;
            }
            return true;
        }

        @Override
        public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
            // 處理Error...
        }
    }
}

原因

  • RestTemplate
public class RestTemplate extends InterceptingHttpAccessor implements RestOperations {
	...
    private ResponseErrorHandler errorHandler;
    ...

    public RestTemplate() {
        ...
        // 默認的ResponseErrorHandler
        this.errorHandler = new DefaultResponseErrorHandler();
        ...
    }

	...

	@Nullable
    protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor) throws RestClientException {
        Assert.notNull(url, "URI is required");
        Assert.notNull(method, "HttpMethod is required");
        ClientHttpResponse response = null;

        Object var14;
        try {
            ClientHttpRequest request = this.createRequest(url, method);
            if (requestCallback != null) {
                requestCallback.doWithRequest(request);
            }

            response = request.execute();
            
            // 處理Response, 這里如果拋出異常,就不會返回ResponseEntity對象
            this.handleResponse(url, method, response);
            
            var14 = responseExtractor != null ? responseExtractor.extractData(response) : null;
        } catch (IOException var12) {
            String resource = url.toString();
            String query = url.getRawQuery();
            resource = query != null ? resource.substring(0, resource.indexOf(63)) : resource;
            throw new ResourceAccessException("I/O error on " + method.name() + " request for \"" + resource + "\": " + var12.getMessage(), var12);
        } finally {
            if (response != null) {
                response.close();
            }

        }

        return var14;
    }

	protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
        ResponseErrorHandler errorHandler = this.getErrorHandler();
        boolean hasError = errorHandler.hasError(response);
        if (this.logger.isDebugEnabled()) {
            try {
                int code = response.getRawStatusCode();
                HttpStatus status = HttpStatus.resolve(code);
                this.logger.debug("Response " + (status != null ? status : code));
            } catch (IOException var8) {
            }
        }

        if (hasError) {
        	// 處理Http錯誤碼
            errorHandler.handleError(url, method, response);
        }

    }

	...
}
  • DefaultResponseErrorHandler
public class DefaultResponseErrorHandler implements ResponseErrorHandler {
    public DefaultResponseErrorHandler() {
    }

    public boolean hasError(ClientHttpResponse response) throws IOException {
        int rawStatusCode = response.getRawStatusCode();
        HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
        return statusCode != null ? this.hasError(statusCode) : this.hasError(rawStatusCode);
    }

    protected boolean hasError(HttpStatus statusCode) {
        return statusCode.isError();
    }

    protected boolean hasError(int unknownStatusCode) {
        Series series = Series.resolve(unknownStatusCode);
        return series == Series.CLIENT_ERROR || series == Series.SERVER_ERROR;
    }

    public void handleError(ClientHttpResponse response) throws IOException {
        HttpStatus statusCode = HttpStatus.resolve(response.getRawStatusCode());
        if (statusCode == null) {
            throw new UnknownHttpStatusCodeException(response.getRawStatusCode(), response.getStatusText(), response.getHeaders(), this.getResponseBody(response), this.getCharset(response));
        } else {
            this.handleError(response, statusCode);
        }
    }

    protected void handleError(ClientHttpResponse response, HttpStatus statusCode) throws IOException {
        String statusText = response.getStatusText();
        HttpHeaders headers = response.getHeaders();
        byte[] body = this.getResponseBody(response);
        Charset charset = this.getCharset(response);
        switch(statusCode.series()) {
        case CLIENT_ERROR:
            throw HttpClientErrorException.create(statusCode, statusText, headers, body, charset);
        case SERVER_ERROR:
            throw HttpServerErrorException.create(statusCode, statusText, headers, body, charset);
        default:
            throw new UnknownHttpStatusCodeException(statusCode.value(), statusText, headers, body, charset);
        }
    }
    
    ...
}
  • RestTemplate中的getForEntity(…)、 getForObject(…)、exchange(…)和delete(…)等方法最終都是調用doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor responseExtractor)方法。
  • 從源代碼可以看出來默認的處理器DefaultResponseErrorHandler,最后會拋出三種異常:HttpClientErrorException、HttpServerErrorException、UnknownHttpStatusCodeException。所以在得到ResponseEntity返回值之前,就有異常拋出。
  • 可以自定義錯誤處理器,自定義的處理器并沒有拋出異常,所以也就可以返回ResponseEntity對象,并通過該對象的getStatusCodeValue()方法獲取HTTP狀態(tài)碼。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringSecurity的@EnableWebSecurity注解詳解

    SpringSecurity的@EnableWebSecurity注解詳解

    這篇文章主要介紹了SpringSecurity的@EnableWebSecurity注解詳解,@EnableWebSecurity是開啟SpringSecurity的默認行為,它的上面有一個Import注解導入了WebSecurityConfiguration類,就是往IOC容器中注入了WebSecurityConfiguration這個類,需要的朋友可以參考下
    2023-11-11
  • Eclipse+Java+Swing+Mysql實現(xiàn)工資管理系統(tǒng)

    Eclipse+Java+Swing+Mysql實現(xiàn)工資管理系統(tǒng)

    這篇文章主要介紹了Eclipse+Java+Swing+Mysql實現(xiàn)工資管理系統(tǒng),對正在工作或者學習的你有一定的參考價值,需要的朋友可以參考一下
    2022-01-01
  • Java實現(xiàn)把excel xls中數(shù)據(jù)轉為可直接插入數(shù)據(jù)庫的sql文件

    Java實現(xiàn)把excel xls中數(shù)據(jù)轉為可直接插入數(shù)據(jù)庫的sql文件

    這篇文章主要介紹了Java實現(xiàn)把excel xls中數(shù)據(jù)轉為可直接插入數(shù)據(jù)庫的sql文件 的相關資料,需要的朋友可以參考下
    2016-03-03
  • 在Java中使用OpenCV實踐

    在Java中使用OpenCV實踐

    用戶分享了在Java項目中集成OpenCV4.10.0的實踐經(jīng)驗,涵蓋庫簡介、Windows安裝、依賴配置及灰度圖測試,強調其在圖像處理領域的多功能性,并計劃后續(xù)探索AI結合應用
    2025-07-07
  • Java中的CyclicBarrier循環(huán)柵欄深入解析

    Java中的CyclicBarrier循環(huán)柵欄深入解析

    這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄深入解析,CycleBarrier 它就相當于是一個柵欄,所有線程在到達柵欄后都需要等待其他線程,等所有線程都到達后,再一起通過,需要的朋友可以參考下
    2023-12-12
  • Java使用Tess4J實現(xiàn)圖像識別方式

    Java使用Tess4J實現(xiàn)圖像識別方式

    這篇文章主要介紹了Java使用Tess4J實現(xiàn)圖像識別方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 經(jīng)典的Java面試題及回答集錦(基礎篇)

    經(jīng)典的Java面試題及回答集錦(基礎篇)

    本文給大家收藏整理了java面試題及回答,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • java中線程池最實用的創(chuàng)建與關閉指南

    java中線程池最實用的創(chuàng)建與關閉指南

    試中經(jīng)常會問到,創(chuàng)建一個線程池需要哪些參數(shù)啊,線程池的工作原理啊,卻很少會問到線程池如何安全關閉的,下面這篇文章主要給大家介紹了關于java中線程池最實用的創(chuàng)建與關閉的相關資料,需要的朋友可以參考下
    2021-09-09
  • 詳解SpringBoot之訪問靜態(tài)資源(webapp...)

    詳解SpringBoot之訪問靜態(tài)資源(webapp...)

    這篇文章主要介紹了詳解SpringBoot之訪問靜態(tài)資源(webapp...),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Mybatis StatementHandler的使用小結

    Mybatis StatementHandler的使用小結

    本文主要介紹了Mybatis StatementHandler的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03

最新評論

思南县| 紫阳县| 岗巴县| 新平| 马山县| 吉林省| 邯郸市| 黑河市| 淮南市| 武宣县| 浮梁县| 峡江县| 鲁甸县| 南城县| 卓资县| 玉树县| 石家庄市| 涿鹿县| 新昌县| 呼图壁县| 普兰县| 宁化县| 徐闻县| 永济市| 汝南县| 新竹县| 舞钢市| 嫩江县| 闻喜县| 荔波县| 库伦旗| 枞阳县| 博客| 赣州市| 茌平县| 神池县| 金溪县| 莱西市| 田东县| 潮安县| 阳朔县|