RestTemplate用法-基本认证、JWT Token认证、自动重试、文件上传
一、基本认证
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.setConnectTimeout(Duration.ofSeconds(10))
.setReadTimeout(Duration.ofSeconds(120))
.basicAuthentication("userName", "password")
.build();
}
二、JWT Token认证
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.setConnectTimeout(Duration.ofSeconds(10))
.setReadTimeout(Duration.ofSeconds(120))
.additionalInterceptors((request, body, execution) -> {
HttpHeaders headers = request.getHeaders();
if (!headers.containsKey(HttpHeaders.AUTHORIZATION)) {
final String accessToken = "accessToken";
headers.setBearerAuth(accessToken);
}
ClientHttpResponse clientHttpResponse = execution.execute(request, body);
return clientHttpResponse;
})
.build();
}
三、请求自动重试
1.pom.xml
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.3.1</version>
</dependency>
2.重试代码实现
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.setConnectTimeout(Duration.ofSeconds(10))
.setReadTimeout(Duration.ofSeconds(120))
.additionalInterceptors((request, body, execution) -> {
RetryTemplate retryTemplate = RetryTemplate.builder()
.maxAttempts(10)
.exponentialBackoff(100, 2, 10000)
.retryOn(RestClientException.class)
.build();
return retryTemplate.execute(context -> execution.execute(request, body));
})
.build();
}
四、文件上传
1. 媒体类型 MediaType.APPLICATION_OCTET_STREAM
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
try (InputStream in = file.getInputStream()) {
HttpEntity<?> requestEntity = new HttpEntity<>(new InputStreamResource(in), headers);
final String result = restTemplate.postForObject(uri, requestEntity, String.class);
}
2. 媒体类型 MediaType.MULTIPART_FORM_DATA
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
try (InputStream in = file.getInputStream()) {
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
requestBody.add("file", new InputStreamResource(in));
HttpEntity<?> requestEntity = new HttpEntity<>(requestBody, headers);
final String result = restTemplate.postForObject(uri, requestEntity, String.class);
}
参考:
精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
Spring Retry重试框架