发送请求

  • getForObject():返回的是指定的类型
  • getForEntity():返回ResponseEntity
  • exchange():RequestEntity参数可设置Header,返回ResponseEntity

    构造uri

    image.png
    image.png

    指定请求头

    image.png
    常用头:
    image.png
    自定义头:
    image.png

  • 构造请求体RequestEntity

  • 调用template.exchange()

    类型转换

    image.png

    泛型List

  • 泛型list:ParameterizedTypeReference

    • 因为泛型擦除

image.png

@JsonComponent 自定义Serializer、Deserializer

image.png
image.png

RestTemplate支持HTTP库

image.png
image.png

连接管理

image.png
image.png

  • 默认keepalive:如果没有keep-alive参数,则连接永久有效【坑】。

    Spring中配置RestTemplate

    1. /**
    2. * KeepAlive策略
    3. */
    4. public class CustomConnectionKeepAliveStrategy implements ConnectionKeepAliveStrategy {
    5. private final long DEFAULT_SECONDS = 30;
    6. @Override
    7. public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
    8. return Arrays.asList(response.getHeaders(HTTP.CONN_KEEP_ALIVE))
    9. .stream()
    10. .filter(h -> StringUtils.equalsIgnoreCase(h.getName(), "timeout")
    11. && StringUtils.isNumeric(h.getValue()))
    12. .findFirst()
    13. .map(h -> NumberUtils.toLong(h.getValue(), DEFAULT_SECONDS))
    14. .orElse(DEFAULT_SECONDS) * 1000;
    15. }
    16. }
    1. @Bean
    2. public HttpComponentsClientHttpRequestFactory requestFactory() {
    3. PoolingHttpClientConnectionManager connectionManager =
    4. new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);
    5. connectionManager.setMaxTotal(200);
    6. connectionManager.setDefaultMaxPerRoute(20);
    7. CloseableHttpClient httpClient = HttpClients.custom()
    8. .setConnectionManager(connectionManager)
    9. .evictIdleConnections(30, TimeUnit.SECONDS)
    10. .disableAutomaticRetries()//禁用自动重试
    11. // 有 Keep-Alive 认里面的值,没有的话永久有效
    12. //.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
    13. // 换成自定义的keepalive策略
    14. .setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy())
    15. .build();
    16. HttpComponentsClientHttpRequestFactory requestFactory =
    17. new HttpComponentsClientHttpRequestFactory(httpClient);
    18. return requestFactory;
    19. }
    20. @Bean
    21. public RestTemplate restTemplate(RestTemplateBuilder builder) {
    22. // return new RestTemplate();
    23. return builder
    24. .setConnectTimeout(Duration.ofMillis(100))
    25. .setReadTimeout(Duration.ofMillis(500))
    26. .requestFactory(this::requestFactory)
    27. .build();
    28. }

    RestTemplate错误处理

    RestTemplate的错误处理_achang07的博客-CSDN博客