2012-06-20 11 views
8

Estoy usando una clase simple de Spring Interceptor para registrar todas las solicitudes/respuestas REST para el objeto RestTemplate en mi aplicación de Android. Hasta ahora todo funciona bien.Lea el cuerpo de respuesta en un Android Spring Interceptor

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; 
} 

En la inicialización Me llaman:

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

Sin embargo, no puede iniciar sesión response.getBody() en el método anterior debido a que el InputStream se consume de una vez y lanza una IllegalStateException cuando se consume de nuevo más tarde. ¿Hay alguna forma de evitar esto para poder registrar el cuerpo de la respuesta también?

Respuesta

11

Para permitir múltiples llamadas response.getBody() ajuste su ClientHttpRequestFactory en una BufferingClientHttpRequestFactory.

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

Usando el marco 3.1 Spring o posterior, esta es definitivamente una solución más elegante. – Nachi

6

Implemente ClientHttpResponse y añada un método setBody(byte[] body) y anule getBody. En el código anterior, puede almacenar la matriz de bytes en un ByteArrayInputStream, registre lo que desea y luego vuelva a establecer la matriz de bytes en la instancia de su clase que implementa ClientHttpResponse, y que luego puede devolver.

Cuestiones relacionadas