2012-06-20 21 views
8

Sto utilizzando una semplice classe Spring Interceptor per registrare tutte le richieste/risposte REST per l'oggetto RestTemplate nella mia app Android. Finora tutto funziona bene.Leggere il corpo della risposta in un interceptor Spring Intel

public class LoggerInterceptor implements ClientHttpRequestInterceptor { 

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

Log.d(TAG, "Request body: " + new String(body)); 
// ...more log statements... 

ClientHttpResponse response = execution.execute(request, body); 

Log.d(TAG, "Response Headers: " + response.getHeaders()); 

return response; 
} 

A inizializzazione mi chiamano:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
LoggerInterceptor loggerInterceptor = new LoggerInterceptor(); 
interceptors.add(loggerInterceptor); 
restTemplate.setInterceptors(interceptors); 

Tuttavia non posso accedere response.getBody() nel metodo di cui sopra, perché l'InputStream si consuma una volta e lancia un IllegalStateException quando viene consumato più tardi. C'è un modo per aggirare questo modo che io possa registrare anche il corpo della risposta?

risposta

11

Per consentire più chiamate response.getBody(), avvolgere ClientHttpRequestFactory in BufferingClientHttpRequestFactory.

ClientHttpRequestFactory requestFactory = 
    new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()); 
restTemplate.setRequestFactory(requestFactory); 
+0

Utilizzando la struttura 3.1 Spring o successiva, questa è sicuramente una soluzione più elegante. – Nachi

6

Implementare lo ClientHttpResponse e aggiungere un metodo setBody(byte[] body) e ignorare getBody. Nel codice sopra riportato, è possibile memorizzare l'array di byte in un ByteArrayInputStream, registrare ciò che si desidera, quindi reimpostare l'array di byte nell'istanza della classe che implementa ClientHttpResponse e che è possibile quindi restituire.

Problemi correlati