Bootstrap

restTemplate

RestTemplate提供了多种方法用于发送HTTP请求,只要是xxx
ForObject,xxxForEntity,exchange,

1.创建实例:

通常可以创建一个RestTemplate()实例并直接使用它

RestTemplate restTemplate = new RestTemplate();

2.发起GET请求

用于检索数据。xxxForObject直接获取响应体

   String result = restTemplate.getForObject("http://example.com.resource",String.class);

3.发起POST请求

用于发送数据到服务器。xxxForEntity用于发送HTTP请求并将整个响应映射为ResponseEntity对象

  Myobject obj =new Myobject();
   ResponseEntity<Myobject> response=
   restTemplate.postForEntity("http://example.com.resource",obj,Myobject.class);

ResponseEntity是一个Spring提供的 用于表示整个Http响应的对象,包含了响应的状态码、头部信息以及响应体等。信息存在ResponseEntity中。当你需要检查的状态码或者头部信息,ResponseEntity就特别有用

     ResponseEntity<String> response =
                restTemplate.getForEntity("http://example.com/resource", String.class);
        HttpStatus statusCode = response .getStatusCode ;
        String body = response .getBody() ;
        HttpHeaders headers = response .getHeaders() ;

4.使用exchange方法

exchange最灵活,可以处理各种HTTP请求,并允许更精细的控制。需要自己构建HttpEntity或者RequestEntity,解析ResponseEntity
构建HttpEntity发起请求
在这里插入图片描述
构造RequestEntity发起请求
在这里插入图片描述

GET请求携带参数

在使用RestTemplate发起GET请求时,有多种方式传递参数

1.在URL中直接包含参数:你可以将参数直接拼在URL中

 String result =    restTemplate.getForObject("http://example.com/resource?param1=value&param2=value2",String.class);

2.使用URI参数:如果你想避免硬编码URL中的参数

在这里插入图片描述
或者《!!!!》
在这里插入图片描述

3.使用Map作为参数

另一种方式是使用一个Map来传递参数,这对动态构建查询字符串特别有用
在这里插入图片描述

4.使用uriComponents和UriTemplate:

这对于构建具有多个参数的复杂URL特别有用
在这里插入图片描述
对于POST请求,参数通常作为请求体发送,也可以将他们作为URL参数传递

POST请求携带参数、

对于post请求来说,参数通常作为请求体发送,也可以将他们作为URL参数传递

1。使用HttpEntity:对于Post和Put请求,你可以创建一个HttpEntity对象来包装请求体和头信息,然后将他们传递给RestTemplate《!!!!!》

在这里插入图片描述

2.使用RequestEntity:requestEntity是一个更灵活的方式,允许你构建包含方法、url、头信息和体的请求

《!!!!!》
在这里插入图片描述

3.使用RestTemplate的exchange方法:这个方法非常灵活,允许你发送任何类型的Http请求,并可以接受HttpEntity作为参数来指定请求体和头信息

在这里插入图片描述

处理返回复杂类型

当使用RestTemplate处理返回复杂类型的响应时,你需要确保RestTemplate能够正确的将响应体反序列化为所需要的复杂类型,一下几种处理方式

1.MappingJackSon2HttpMessageConverter:

如果返回复杂类型,响应体是Json或者XML格式,并且你有一个与之匹配的java类,你可以直接将这个类作为getForObject或exchange方法的参数
在这里插入图片描述

对于一般对象类型:restTemplate默认使用MappingJackson2HttpMessageConverter对返回的数据进行Json数据反序列化,映射为指定类型的java对象(这里是MyComplexResponse),无需我们配置。但在处理泛型和集合的时候,因为泛型擦除MappingJackson2HttpMessageConverter一般只能转成LinkedHashMap类型,不能转换成一个具体对象

2.使用ParameterizedTypeReference:

当你需要处理泛型或集合(例如List)时,需要使用ParameterizedTypeReference。如果没有ParameterizedTypeReference,RestTemplate将返回一个未经正确泛型处理的对象,通常是LinkedHasMap的列表,而不是期望的泛型类型对象列表
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.定制MessageConverter

在这里插入图片描述

RestTemplate处理日期格式

1.定制全局日期格式

MappingJackson2HttpMessageConverter通常使用objectMapper进行Json数据的转换。你可以通过设置MappingJackson2HttpMessageConverter的objectMapper属性来自定义JSON数据的处理方式,例如设置日期格式,处理空值等。

1.配置默认的日期格式

:你可以设置一个全局的日期格式,这样所有的日期/时间类型都会使用这个格式进行序列化和反序列化

ObjectMapper objectMapper = new ObjectMapper();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        objectMapper.setDateFormat(dateFormat);

2.注册到MappingJackson2HttpMessageConverter

将定制的objectMapper注册到MappingJackson2HttpMessageConverter

  MappingJackson2HttpMessageConverter converter   = new MappingJackson2HttpMessageConverter();
          converter.setObjectMapper(objectMapper);

3.添加到RestTemplate;

如果你在使用 RestTemplate确保添加自定义的转换器

 RestTemplate restTemplate =   new RestTemplate();
        restTemplate.getMessageConverters().add(converter);
使用注解指定字段的日期格式

在这里插入图片描述

处理java8日期和时间API

在这里插入图片描述

RestTemplate设置请求超时时间

在RestTemplate中设置请求超时时间通常涉及到自定义底层的HTTP客户端。下面是一个使用Httpclient设置连接超时和读取超时的例子:

使用HttpClient设置超时

1。添加依赖:首先确保你的项目包含了Httpclient相关的依赖,对于maven项目,可以添加如下依赖


    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.5</version>
    </dependency>  

2.创建Httpclient实例:使用HttpclientBuilder来创建一个Httpclient实例,并设置超时参数

	RequestConfig requestConfig = RequestConfig.custom()
					// 设置连接超时时间(单位毫秒)
					.setConnectTimeout(5000)
					// 设置请求超时时间(单位毫秒)
					.setConnectionRequestTimeout(5000)
					// socket读写超时时间(单位毫秒)
					.setSocketTimeout(5000)
					// 设置是否允许重定向(默认为true)
					.setRedirectsEnabled(true).build();

3.配置RestTemplate使用自定义的Httpclient:将Httpclient实例设置到RestTemplate的clientHttpRequestFactory中
在这里插入图片描述

使用RestTemplateBuilder

在springBoot环境中,你可以使用RestTemplateBuilder来更简单地设置超时参数
在这里插入图片描述
在这里插入图片描述

RestTemplate设置重试

在使用RestTemplate进行远程服务调用时,有一些情况下可能考虑使用重试机制

1.连接失败

当网络不稳定或出现瞬时的连接问题时,可能导致远程服务调用失败。重试可以尝试重新建立连接,以应对网络波动或短暂的连接故障。

2.超时问题

:当远程服务响应超时时,可能是由于服务负载大或者执行时间过长。在这种情况下,重试可以在一定时间内重新尝试,以获取更快的响应。

3.服务不可用

当远程服务不可用时,可能是由于服务升级、部署或者其他原因导致的短暂的不可用状态。重试可以等待服务恢复正常后重新发送请求。

4.HTTP状态码处理

在收到预期的HTTP状态码时,例如5xx表示服务器错误,重试可以尝试重新发送请求,期望在下一次尝试时获得成功的响应。

在 RestTemplate 中实现重试机制通常需要外部库的支持,因为 Spring 自身并不直接提供内置的重试功能.最常见的方法是使用 Spring Retry 或 Apache HttpClient。以下是如何实现重试机制的两种方法:

使用Spring Retry(引到客户端)

1.添加依赖

    <dependency>
      <groupId>org.springframework.retry</groupId>
      <artifactId>spring-retry</artifactId>
      <version>1.3.1</version>
    </dependency>

2.设置重试模板

在这里插入图片描述

3.应用重试模板

在这里插入图片描述

4.抛出异常

RetryTemplate 只有在发生异常时才会触发重试。这是 RetryTemplate 的默认行为,它在执行过程中捕获异常并根据配置进行重试

使用Apache HttpClient 的重试处理器

如果你正在使用 Apache HttpClient 作为 RestTemplate 的底层HTTP 客户端,可以配置它的重试处理器。

1.创建自定义的重试处理器

在这里插入图片描述

2.配置HttpClient使用重试处理器

在这里插入图片描述
使用Apache HttpClient 的重试处理器时,超时和抛出异常都有可能触发重试。当发生超时,HttpClient 通常会抛出 socketTimeoutException 或 connectTimeoutException 异常,这将触发重试。同时,HttpClient的 HttprequestRetryHander 接口允许你自定义在请求失败时进行重试的逻辑,这样你可以根据自己的需求判断是否要进行重试,不仅限于异常的抛出。

;