RestTemplateConfig.java
4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.infoloop.tianting.config;
import com.infoloop.tianting.intercepter.HttpRequestLogInterceptor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@Configuration
@Slf4j
public class RestTemplateConfig {
@Value("${okhttp.connect-timeout}")
private Integer connectTimeout;
@Value("${okhttp.read-timeout}")
private Integer readTimeout;
@Value("${okhttp.write-timeout}")
private Integer writeTimeout;
@Value("${okhttp.max-idle-connections}")
private Integer maxIdleConnections;
@Value("${okhttp.keep-alive-duration}")
private Integer keepAliveDuration;
@Bean
public OkHttpClient okHttpClient() throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAllCertificates = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCertificates, new SecureRandom());
return new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCertificates[0])
.hostnameVerifier((hostname, session) -> true)
.connectTimeout(connectTimeout, TimeUnit.SECONDS)
.readTimeout(readTimeout, TimeUnit.SECONDS)
.writeTimeout(writeTimeout, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.connectionPool(new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.MINUTES))
.build();
}
@Bean
public RestTemplate httpRestTemplate(OkHttpClient okHttpClient, HttpRequestLogInterceptor interceptor) {
final var restTemplate = new RestTemplate(httpRequestFactory(okHttpClient));
restTemplate.setErrorHandler(new CustomResponseErrorHandler());
for (final var converter : restTemplate.getMessageConverters()) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
break;
}
}
final var interceptors = new ArrayList<ClientHttpRequestInterceptor>();
interceptors.add(interceptor);
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
/**
* HTTP request factory
*/
private ClientHttpRequestFactory httpRequestFactory(OkHttpClient okHttpClient) {
return new OkHttp3ClientHttpRequestFactory(okHttpClient);
}
public static final class CustomResponseErrorHandler extends DefaultResponseErrorHandler {
@Override
public void handleError(ClientHttpResponse response) throws IOException {
if (response.getStatusCode().is4xxClientError() || response.getStatusCode().is5xxServerError()) {
log.error("response statusCode: {}", response.getStatusCode());
log.error("response error body: {}", new String(response.getBody().readAllBytes()));
}
// 此地不直接抛异常,交给业务代码处理
// super.handleError(response);
}
}
}