1.实现拦截器接口
package com.pcis.auth.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* @Author crl
* @Date 2023/1/4 9:54
* @Description:
*/
@Slf4j
public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
ClientHttpResponse resp = null;
log.info("request info, URI : {}, Method : {}, Headers : {}, Param : {}",request.getURI(),request.getMethod(),request.getHeaders(),new String(body, StandardCharsets.UTF_8));
try {
resp = execution.execute(request, body);
}catch (Exception e){
log.error("request exception, msg : {}",e.getMessage());
throw e;
}
trace(request,body,resp);
return resp;
}
private void trace(HttpRequest request, byte[] body, ClientHttpResponse response) throws IOException {
// 记录日志
String responseStr = IOUtils.toString(response.getBody(), StandardCharsets.UTF_8);
log.info("request result,RespStatus : {} Response : {} ", response.getStatusCode(), responseStr);
}
}
2.配置 RestTemplate
package com.pcis.auth.config;
import com.pcis.auth.interceptor.LoggingRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
/**
* @Author crl
* @Date 2023/1/4 10:44
* @Description:
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
= new HttpComponentsClientHttpRequestFactory();
// // 连接超时
// clientHttpRequestFactory.setConnectTimeout(httpClientProperties.getConnectionTimeOut());
// // 数据读取超时时间
// clientHttpRequestFactory.setReadTimeout(httpClientProperties.getSocketTimeOut());
// // 连接不够用的等待时间
// clientHttpRequestFactory.setConnectionRequestTimeout(httpClientProperties.getConnectionRequestTimeout());
//通过BufferingClientHttpRequestFactory对象包装现有的ResquestFactory,用来支持多次调用getBody()方法
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(clientHttpRequestFactory));
// 打印记录
// restTemplate.setInterceptors(Collections.singletonList(new LoggingRequestInterceptor(httpClientProperties.getLogTimeoutMs())));
restTemplate.setInterceptors(Collections.singletonList(new LoggingRequestInterceptor()));
return restTemplate;
}