2015-07-17 15 views
7

Sto usando spring con RestTemplate per eseguire query GET.Come registrare la richiesta e la risposta di RestTemplate con molla?

Come posso registrare qualsiasi richiesta e dati di risposta su un file di registro automaticamente su ogni richiesta?

+1

possibile duplicato di [? Primavera RestTemplate - come attivare il debug pieno/registrazione di richieste/risposte] (http://stackoverflow.com/questions/7952154/spring -resttemplate-how-to-enable-full-debugging-logging-of-requests-responses) – rhorvath

+0

Questo non aiuta perché quando intercetto il messaggio, avrei oggetti java di tipo 'org.springframework.http.client .InterceptingClientHttpRequest' e 'org.springframework.http.client.SimpleClientHttpResponse'. Quello di cui ho bisogno è una rappresentazione text/xml della risposta e registro invece questa. – membersound

+2

hai provato a inviare messaggi passando un Apache httpClient al restTempalte e abilitare il log a livello httpclient? – Giovanni

risposta

4

È possibile ottenere questo utilizzando ClientHttpRequestInterceptor in primavera. È necessario eseguire l'override del metodo intercettare dell'interfaccia ClientHttpRequestInterceptor.

Di seguito si riporta il frammento di codice:

@Component 
public class LogRequestResponseFilter implements ClientHttpRequestInterceptor { 

private static final Logger logger=LoggerFactory.getLogger(LogRequestResponseFilter.class); 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) 
     throws IOException { 

     traceRequest(request, body); 
     ClientHttpResponse clientHttpResponse = execution.execute(request, body); 
     traceResponse(clientHttpResponse); 

     return clientHttpResponse; 
    } 

private void traceRequest(HttpRequest request, byte[] body) throws IOException { 
     logger.debug("request URI : " + request.getURI()); 
     logger.debug("request method : " + request.getMethod()); 
     logger.debug("request body : " + getRequestBody(body)); 
    } 

    private String getRequestBody(byte[] body) throws UnsupportedEncodingException { 
     if (body != null && body.length > 0) { 
     return (new String(body, "UTF-8")); 
     } else { 
     return null; 
     } 
    } 


    private void traceResponse(ClientHttpResponse response) throws IOException { 
     String body = getBodyString(response); 
     logger.debug("response status code: " + response.getStatusCode()); 
     logger.debug("response status text: " + response.getStatusText()); 
     logger.debug("response body : " + body); 
    } 

    private String getBodyString(ClientHttpResponse response) { 
     try { 
     if (response != null && response.getBody() != null) {// && 
                   // isReadableResponse(response)) 
                   // { 
      StringBuilder inputStringBuilder = new StringBuilder(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), StandardCharsets.UTF_8)); 
      String line = bufferedReader.readLine(); 
      while (line != null) { 
       inputStringBuilder.append(line); 
       inputStringBuilder.append('\n'); 
       line = bufferedReader.readLine(); 
      } 
      return inputStringBuilder.toString(); 
     } else { 
      return null; 
     } 
     } catch (IOException e) { 
     logger.error(e.getMessage(), e); 
     return null; 
     } 
    } 
+0

È sufficiente aggiungere '@ Componente' al' Interceptor 'personalizzato? O devo registrarlo esplicitamente da qualche parte, ad esempio su un 'RestTemplate'? Perché è quello che sto cercando di impedire: dover registrarmi e collegarlo da solo. – membersound

+0

Credo che @Component sia sufficiente. Puoi seguire il link sottostante che è una buona fonte di esempio. http://blog.cacoveanu.com/2016/06/24/rest-template-logging.html –

+2

Questo registri correttamente ma cosa succede se il 'InputStream' sottostante non supporta la marcatura? Una volta letto, è sparito. –

Problemi correlati