2012-06-20 11 views
8

Android uygulamamda RestTemplate nesnesi için tüm REST isteklerini/yanıtlarını günlüğe kaydetmek için basit bir Spring Interceptor sınıfı kullanıyorum. Şimdiye kadar her şey iyi çalışıyor. Başlatma andaAndroid Spring Interceptor'daki yanıt gövdesini okuyun

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

ararım:

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

Ancak inputStream kez tüketilen ve ileride yeniden tüketilen bir IllegalStateException atar olur çünkü yukarıdaki yöntemde response.getBody() giriş yapamıyorum. Bunun etrafında bir yol var mı, böylece yanıt kütüğünü de kaydedebilirim?

cevap

11

Birden çok response.getBody() numaralı çağrıya izin vermek için ClientHttpRequestFactory dosyanızı bir BufferingClientHttpRequestFactory içine sarın.

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

3.1 Yay çerçevesi veya daha sonra, bu kesinlikle daha zarif bir çözümdür. – Nachi

6

Kendinizi ClientHttpResponse uygulayın ve setBody(byte[] body) yöntemini ekleyin ve getBody'u geçersiz kılın. Yukarıdaki kodunuzda, daha sonra ByteArrayInputStream bayt dizisini saklayabilir, ne istediğinizi günlüğe kaydedebilir, daha sonra ClientHttpResponse uygulayan sınıfın örneğinde bayt dizisini ayarlayabilir ve daha sonra geri dönebilirsiniz.