我使用 Spring RestTemplate 已经有一段时间了,当我尝试调试它的请求和响应时,我总是碰壁。我基本上希望看到与打开“详细”选项使用 curl 时看到的相同的东西。例如:
curl -v http://twitter.com/statuses/public_timeline.rss
将显示发送的数据和接收的数据(包括 header 、cookie 等)。
我查看了一些相关的帖子,例如: How do I log response in Spring RestTemplate? 但我还没有设法解决这个问题。
这样做的一种方法是实际更改 RestTemplate 源代码并在那里添加一些额外的日志记录语句,但我会发现这种方法确实是最后的手段。应该有一些方法可以告诉 Spring Web Client/RestTemplate 以更友好的方式记录所有内容。
我的目标是能够使用如下代码做到这一点:
restTemplate.put("http://someurl", objectToPut, urlPathValues);
然后在日志文件或控制台中获得相同类型的调试信息(就像我使用 curl 获得的那样)。 我相信这对于使用 Spring RestTemplate 并遇到问题的任何人都非常有用。使用 curl 来调试您的 RestTemplate 问题只是不起作用(在某些情况下)。
最佳答案
只是用完整的 ClientHttpRequestInterceptor
实现来完成示例以跟踪请求和响应:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
public class LoggingRequestInterceptor implements ClientHttpRequestInterceptor {
final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
traceRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
traceResponse(response);
return response;
}
private void traceRequest(HttpRequest request, byte[] body) throws IOException {
log.info("===========================request begin================================================");
log.debug("URI : {}", request.getURI());
log.debug("Method : {}", request.getMethod());
log.debug("Headers : {}", request.getHeaders() );
log.debug("Request body: {}", new String(body, "UTF-8"));
log.info("==========================request end================================================");
}
private void traceResponse(ClientHttpResponse response) throws IOException {
StringBuilder inputStringBuilder = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));
String line = bufferedReader.readLine();
while (line != null) {
inputStringBuilder.append(line);
inputStringBuilder.append('\n');
line = bufferedReader.readLine();
}
log.info("============================response begin==========================================");
log.debug("Status code : {}", response.getStatusCode());
log.debug("Status text : {}", response.getStatusText());
log.debug("Headers : {}", response.getHeaders());
log.debug("Response body: {}", inputStringBuilder.toString());
log.info("=======================response end=================================================");
}
}
然后使用 BufferingClientHttpRequestFactory
和 LoggingRequestInterceptor
实例化 RestTemplate
:
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
restTemplate.setInterceptors(interceptors);
BufferingClientHttpRequestFactory
是必需的,因为我们希望在拦截器和初始调用代码中都使用响应体。默认实现只允许读取一次响应正文。
关于java - Spring RestTemplate - 如何启用请求/响应的完整调试/日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952154/