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!