Maison >Java >javaDidacticiel >Comment pouvez-vous améliorer le débogage de Spring RestTemplate avec une journalisation complète des demandes/réponses ?

Comment pouvez-vous améliorer le débogage de Spring RestTemplate avec une journalisation complète des demandes/réponses ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-21 17:00:10690parcourir

How can you enhance Spring RestTemplate debugging with comprehensive request/response logging?

Débogage amélioré avec SpringRestTemplate : activation d'une journalisation complète des requêtes/réponses

Le Spring RestTemplate, un outil polyvalent utilisé pour effectuer des requêtes HTTP, pose souvent défis lors du débogage en raison d’une visibilité limitée sur les données de demande et de réponse. Heureusement, plusieurs approches existent pour surmonter ces obstacles.

Une solution courante consiste à implémenter des instructions de journalisation personnalisées dans le code source de RestTemplate, mais cette approche n'est pas recommandée car elle présente des problèmes de maintenabilité et de qualité du code.

Alternativement, l'utilisation de l'interface ClientHttpRequestInterceptor fournit une solution plus élégante et extensible. En implémentant cette interface, les développeurs peuvent tracer les demandes et les réponses avec des informations de journalisation détaillées.

Voici une implémentation complète de ClientHttpRequestInterceptor pour le traçage des demandes et des réponses :

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=================================================");
    }

}

Pour utiliser cet intercepteur, instanciez un RestTemplate avec un BufferingClientHttpRequestFactory et ajoutez le intercepteur :

RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new LoggingRequestInterceptor());
restTemplate.setInterceptors(interceptors);

Grâce à ces étapes, une journalisation complète des requêtes et des réponses devient accessible dans votre code Java, permettant un débogage et un dépannage efficaces des interactions réseau.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn