import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestTemplate;
import java.io.*;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* RestTemplate配置
*
* @author zhang
*/
@Slf4j
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// 添加拦截器
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
MyRequestInterceptor myRequestInterceptor = new MyRequestInterceptor();
interceptors.add(myRequestInterceptor);
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
class MyRequestInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
traceRequest(request, bytes);
ClientHttpResponse response = execution.execute(request, bytes);
ClientHttpResponse responseCopy = new BufferingClientHttpResponseWrapper(response);
traceResponse(responseCopy);
return responseCopy;
}
/**
* 打印请求数据
*
* @param request 请求
* @param bytes 请求体
*/
private void traceRequest(HttpRequest request, byte[] bytes) {
HttpMethod method = request.getMethod();
URI uri = request.getURI();
String path = uri.getPath();
String query = uri.getQuery();
String body = new String(bytes, StandardCharsets.UTF_8);
log.info("Request URL = [{}] {}?{}", method, path, query);
log.info("Request Body = {}", body);
}
/**
* 打印响应结果
*
* @param response 响应结果
* @throws IOException io
*/
private void traceResponse(ClientHttpResponse response) throws IOException {
StringBuilder inputStringBuilder = new StringBuilder();
try (BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(response.getBody(), StandardCharsets.UTF_8))) {
String line = bufferedReader.readLine();
while (line != null) {
inputStringBuilder.append(line);
// inputStringBuilder.append('\n');
line = bufferedReader.readLine();
}
}
log.info("Response : {} {}", response.getStatusCode(), response.getStatusText());
log.info("Response Body: {}", inputStringBuilder.toString());
}
}
final class BufferingClientHttpResponseWrapper implements ClientHttpResponse {
private final ClientHttpResponse response;
private byte[] body;
BufferingClientHttpResponseWrapper(ClientHttpResponse response) {
this.response = response;
}
@Override
public HttpStatus getStatusCode() throws IOException {
return this.response.getStatusCode();
}
@Override
public int getRawStatusCode() throws IOException {
return this.response.getRawStatusCode();
}
@Override
public String getStatusText() throws IOException {
return this.response.getStatusText();
}
@Override
public HttpHeaders getHeaders() {
return this.response.getHeaders();
}
@Override
public InputStream getBody() throws IOException {
if (this.body == null) {
this.body = StreamUtils.copyToByteArray(this.response.getBody());
}
return new ByteArrayInputStream(this.body);
}
@Override
public void close() {
this.response.close();
}
}
}
RestTemplate打印响应结果
最新推荐文章于 2024-07-05 10:14:24 发布