gpt4 book ai didi

spring - 为什么我的自定义 ClientHttpRequestInterceptor 响应为空

转载 作者:行者123 更新时间:2023-12-02 09:38:59 25 4
gpt4 key购买 nike

我已经为我的自定义日志拦截器完成了以下操作

public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
private final static Logger log = LoggerFactory.getLogger(HttpLoggingInterceptor.class);

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
logRequest(request, body);
ClientHttpResponse response = execution.execute(request, body);
logResponse(response);
return response;
}

private void logRequest(HttpRequest request, byte[] body) throws IOException {
log.info("Request URI : {}, Method : {}, Headers : {}, Request body : {}", request.getURI(), request.getMethod(), request.getHeaders(), new String(body, "UTF-8"));

}

private void logResponse(ClientHttpResponse response) throws IOException {
log.info("Response Status code : {}, Status text : {}, Headers : {}, Response body: {}", response.getStatusCode(), response.getStatusText(), response.getHeaders(), StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
}
}

我将拦截器设置为restTemplate

   @Autowired
public RestTemplate restTemplate;

@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
List<ClientHttpRequestInterceptor> clientHttpRequestInterceptors = new ArrayList<>();
clientHttpRequestInterceptors.add(new HttpLoggingInterceptor());
// clientHttpRequestInterceptors.addAll(restTemplate.getInterceptors());
restTemplate.setInterceptors(clientHttpRequestInterceptors);
// restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
}

记录器正在将响应正确打印到控制台,但最终响应将作为空返回给调用者。我无法调试并弄清楚它。

我发现 StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()) 正在读取输入流一次,并且不再在其中保存响应正文(现在是空的)

还有其他人也面临同样的问题,并且有任何想法复制输入流而不从原始输入流中读取它吗?

最佳答案

由于输入流只能使用一次,并且 sun.net 没有可用的 reset()mark(***) 函数。 www.protocol.http.HttpURLConnection$HttpInputStream.

只有一种方法可以多次读取响应,即通过以下方式创建restTemplate。

@Bean
public RestTemplate getfxoWsClientRestTemplate(){
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
return restTemplate;
}

LoggingIntercepter可以这样写

public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {

private final static Logger logger = LoggerFactory.getLogger(HttpLoggingInterceptor.class);

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
logger.info("request method: {}, request URI: {}, request headers: {}, request body: {}",
request.getMethod(), request.getURI(), request.getHeaders(), new String(body, Charset.forName("UTF-8")));

ClientHttpResponse response = execution.execute(request, body);

logger.info("response status code: {}, response headers: {}, response body: {}",
response.getStatusCode(), response.getHeaders(), new String(ByteStreams.toByteArray(response.getBody()), Charset.forName("UTF-8")));

return response;
}

}

关于spring - 为什么我的自定义 ClientHttpRequestInterceptor 响应为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com