Spring Boot RestTemplate ClientHttpRequestInterceptor 日志响应正文



我正在使用 ClientHttpRequestInterceptor 来报告 RestTemplate 的请求输出和响应。我需要记录响应以防异常,假设模板是否试图使用错误的类取消响应。

以下是启用拦截器的方式:

@Bean
public RestTemplate restTemplate(ReportingConfiguration reportingConfiguration) {
return new RestTemplateBuilder()
.interceptors(new RestTemplateInterceptor())
.build();
}

这里唯一接受的接口是 ClientHttpRequestInterceptor。 拦截器如下所示:

@Override
public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution execution) throws IOException {
...
ClientHttpResponse response = null;
try {
response = execution.execute(request, body);
} catch (Exception e) {
System.out.println("I need to get the response here");
}
...

我知道这门课不可能得到回应,你能给出一个替代解决方案吗?

这是异常的一个例子:(请不要解释如何摆脱此异常,我知道为什么我会得到这个,我只想记录有效负载以防万一(

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "items" (class com.exapmle.group.web.beans.Response), not marked as ignorable (3 known properties: "text", "status", "set-cookies"]) at [Source: (ByteArrayInputStream); line: 1, column: 11] (through reference chain: com.exapmle.group.web.beans.Response["items"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:823) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1153) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1589) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1567) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)

这是老问题 如果有人在看,我仍然会回答。如果出现 http 代码(例如 500(的 API 错误,我能够使用以下配置获得响应。

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000); 
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(factory));
restTemplate.setInterceptors(Collections.singletonList(new CustomLoggingRequestInterceptor()));
return restTemplate;
}

现在是日志记录拦截器。

@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 traceResponse(ClientHttpResponse response) throws IOException {
StringBuilder inputStringBuilder = new StringBuilder();
inputStringBuilder.append(new String(getResponseBody(response), StandardCharsets.UTF_8));
log.error(inputStringBuilder.toString()); 
}

protected byte[] getResponseBody(ClientHttpResponse response) {
try {
return FileCopyUtils.copyToByteArray(response.getBody());
} catch (IOException ex) {
// ignore
}
return new byte[0];
}

这应该有效:

ClientHttpResponse response = null;
try {
response = execution.execute(request, body);
} catch (Exception e) {
System.out.println("I need to get the response here", e.getMessage());
}

相关内容

最新更新