paulwong

          RestTemplate處理請求狀態(tài)碼為非200的返回?cái)?shù)據(jù)

          RestTemplate是Spring提供的用于訪問Rest服務(wù)的客戶端,

          RestTemplate提供了多種便捷訪問遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率。

          調(diào)用RestTemplate的默認(rèn)構(gòu)造函數(shù),RestTemplate對象在底層通過使用java.net包下的實(shí)現(xiàn)創(chuàng)建HTTP 請求,

          可以通過使用ClientHttpRequestFactory指定不同的HTTP請求方式。

          ClientHttpRequestFactory接口主要提供了兩種實(shí)現(xiàn)方式

          1、一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)創(chuàng)建底層的Http請求連接。

          2、一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠(yuǎn)程的Http服務(wù),使用HttpClient可以配置連接池和證書等信息。

          默認(rèn)的 RestTemplate 有個(gè)機(jī)制是請求狀態(tài)碼非200 就拋出異常,會(huì)中斷接下來的操作。如果不想中斷對結(jié)果數(shù)據(jù)得解析,可以通過覆蓋默認(rèn)的 ResponseErrorHandler ,見下面的示例,示例中的方法中基本都是空方法,只要對hasError修改下,讓他一直返回true,即是不檢查狀態(tài)碼及拋異常了。

          package com.example.demo.web.config;

          import java.io.IOException;

          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.http.client.ClientHttpRequestFactory;
          import org.springframework.http.client.ClientHttpResponse;
          import org.springframework.http.client.SimpleClientHttpRequestFactory;
          import org.springframework.web.client.ResponseErrorHandler;
          import org.springframework.web.client.RestTemplate;

          @Configuration
          public class RestTemplateConfig {
              
              @Bean
              public RestTemplate restTemplate(ClientHttpRequestFactory factory) throws Exception {
                  RestTemplate restTemplate = new RestTemplate(factory);
                  ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
                      @Override
                      public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
                          return true;
                      }
                      @Override
                      public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
                      }
                  };
                  restTemplate.setErrorHandler(responseErrorHandler);
                  return restTemplate;
              }
              
              @Bean
              public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
                  SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
                  //讀取超時(shí)5秒
                  factory.setReadTimeout(5000);
                  //連接超時(shí)15秒
                  factory.setConnectTimeout(15000);
                  return factory;
              }
          }

          RestTemppate運(yùn)用實(shí)例

          package com.example.demo.web.controller;

          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          import org.springframework.beans.factory.annotation.Autowired;
          import org.springframework.http.ResponseEntity;
          import org.springframework.web.bind.annotation.GetMapping;
          import org.springframework.web.bind.annotation.RestController;
          import org.springframework.web.client.RestTemplate;

          import com.example.demo.domain.Book;

          @RestController
          public class TestBookController {
              private Logger logger = LoggerFactory.getLogger(getClass());
              
                @Autowired
                private RestTemplate restTemplate;
                
                @GetMapping("/testaddbook")
                public Book testAddBook() {
                        Book book = new Book();
                        ResponseEntity<Book> responseEntity = restTemplate.postForEntity( "http://localhost:8061/book", book , Book.class);
                        return responseEntity.getBody();
                }

          }

          其他方法,catch HttpStatusCodeException e.getResponseBodyAsString()
          try {
              ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
                  HttpMethod.POST, 
                  requestEntity,
                  Component.class);
          catch (HttpStatusCodeException e) {
              List<String> customHeader = e.getResponseHeaders().get("x-app-err-id");
              String svcErrorMessageID = "";
              if (customHeader != null) {
                  svcErrorMessageID = customHeader.get(0);                
              }
              throw new CustomException(e.getMessage(), e, svcErrorMessageID);
              // You can get the body too but you will have to deserialize it yourself
              
          // e.getResponseBodyAsByteArray()
              
          // e.getResponseBodyAsString()
          }

          https://stackoverflow.com/questions/7878002/resttemplate-handling-response-headers-body-in-exceptions-restclientexception

          https://stackoverflow.com/questions/38093388/spring-resttemplate-exception-handling/51805956#51805956

          posted on 2020-10-16 16:54 paulwong 閱讀(1246) 評論(0)  編輯  收藏 所屬分類: SPRING

          主站蜘蛛池模板: 柳林县| 长武县| 西乡县| 义马市| 浪卡子县| 三台县| 阿拉尔市| 兴化市| 崇信县| 博客| 深州市| 武义县| 永胜县| 扶余县| 三河市| 定州市| 河源市| 武胜县| 阜南县| 依兰县| 洪洞县| 白河县| 安丘市| 乌拉特中旗| 公主岭市| 中西区| 阳谷县| 汽车| 文登市| 清水河县| 江孜县| 长兴县| 凯里市| 农安县| 衡山县| 乌鲁木齐市| 鱼台县| 哈密市| 从化市| 鄂州市| 石柱|