[JAVA] Déconnectez-vous de la demande / réponse de RestTemplate

Aperçu

Je veux enregistrer l'exécution de l'API Web par RestTemplate fourni par le framework Spring.

environnement

Insérez ClientHttpRequestInterceptor dans RestTemplate

--Utiliser un intercepteur qui intervient dans la requête / réponse de RestTemplate

Intercepteur qui génère des journaux

Intercepteur de modèle de repos


import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

@Slf4j
public class RestTemplateLoggingInterceptor implements ClientHttpRequestInterceptor {

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

    private void logRequest(UUID requestUuid, HttpRequest request, byte[] body) {
        if (log.isInfoEnabled()) {
            log.info("[API:Request({})] Request=[{}:{}], Headers=[{}], Body=[{}]",
                requestUuid,
                request.getMethod(),
                request.getURI(),
                request.getHeaders(),
                new String(body)
            );
        }
    }

    private void logResponse(UUID requestUuid, ClientHttpResponse response) throws IOException {
        if (log.isInfoEnabled()) {
            log.info("[API:Response({})] Status=[{}:{}], Headers=[{}], Body=[{}]",
                requestUuid,
                response.getStatusCode().value(),
                response.getStatusText(),
                response.getHeaders(),
                StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8)
            );
        }
    }

}

Définition du bean de RestTemplate

@Configuration
public class ExternalApiConfig {

    @Bean
    RestTemplate restTemplate() {
        return new RestTemplateBuilder()
            .requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()))
            .additionalInterceptors(new RestTemplateLoggingInterceptor())
            .build();
    }

}

référence

Consignez le contenu des demandes et des réponses avec RestTemplate

Recommended Posts

Déconnectez-vous de la demande / réponse de RestTemplate
Sortie du journal de la requête / réponse WebServiceTemplate
Sortie des journaux de demande et de réponse avec Spring Boot