Für den Fall, dass jemand in einer Spring Boot-Anwendung läuft und Sie den Antwortkörper einer RestTemplate
(weshalb ich einen Stream zweimal lesen möchte), gibt es einen sauberen Weg, dies zu tun.
Zuallererst müssen Sie die Spring-Funktion StreamUtils
um den Stream in einen String zu kopieren:
String text = StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()))
Aber das ist noch nicht alles. Sie müssen auch eine Anforderungsfabrik verwenden, die den Stream für Sie puffern kann, etwa so:
ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory());
RestTemplate restTemplate = new RestTemplate(factory);
Oder, wenn Sie die Fabrik Bohne verwenden, dann (dies ist Kotlin aber trotzdem):
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
fun createRestTemplate(): RestTemplate = RestTemplateBuilder()
.requestFactory { BufferingClientHttpRequestFactory(SimpleClientHttpRequestFactory()) }
.additionalInterceptors(loggingInterceptor)
.build()
Quelle: https://objectpartners.com/2018/03/01/log-your-resttemplate-request-and-response-without-destroying-the-body/