Beim Debuggen eines Spring RestTemplate kann die Überprüfung der Anfragen und Antworten unschätzbare Erkenntnisse liefern. Um die ausführliche Ausgabe des Curl-Befehls mit der Option „-v“ zu replizieren, müssen wir die detaillierte Protokollierung oder das Debuggen für das RestTemplate aktivieren.
Ein Ansatz besteht darin, den Quellcode des RestTemplate so zu ändern, dass er zusätzliche Protokollierungsanweisungen enthält Dies wird nicht als primäre Lösung empfohlen. Stattdessen können wir die Leistungsfähigkeit von ClientHttpRequestInterceptor nutzen.
Benutzerdefinierter ClientHttpRequestInterceptor für die Anforderungs-/Antwortprotokollierung
Um sowohl Anforderungs- als auch Antwortdetails zu protokollieren, können wir einen benutzerdefinierten implementieren ClientHttpRequestInterceptor:
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================================================="); } }
RestTemplate-Konfiguration mit Pufferung und Interceptor
Um unseren benutzerdefinierten Interceptor zu verwenden, konfigurieren Sie das RestTemplate wie folgt:
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new LoggingRequestInterceptor()); restTemplate.setInterceptors(interceptors);
Beachten Sie, dass die BufferingClientHttpRequestFactory erforderlich ist, um dem Interceptor dies zu ermöglichen Greifen Sie mehrmals auf den Antworttext zu.
Nutzung und erwartete Ausgabe
Mit dieser Konfiguration protokolliert der Aufruf von restTemplate.execute() die Anfrage- und Antwortdetails im gewünschtes Format:
restTemplate.put("http://someurl", objectToPut, urlPathValues);
Und Sie werden Folgendes im Protokoll sehen:
===========================request begin=============================================== URI : http://someurl Method : PUT Headers : {...} Request body: {...} ==========================request end=============================================== ============================response begin========================================== Status code : 200 Status text : OK Headers : {...} Response body: {...} =======================response end=================================================
Dies detailliert Die Protokollierung bietet einen umfassenden Überblick über die Interaktionen des RestTemplate und macht das Debuggen deutlich effizienter und bequemer. Durch die Vermeidung von Codeänderungen und die Nutzung der bereitgestellten Erweiterbarkeitsmechanismen bietet dieser Ansatz eine saubere und flexible Lösung für diese häufige Debugging-Herausforderung.
Das obige ist der detaillierte Inhalt vonWie protokolliere ich Spring RestTemplate-Anfragen und -Antworten für ein effektives Debugging?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!