2012-06-20 84 views
8

我正在使用一個簡單的Spring Interceptor類在Android應用程序中記錄RestTemplate對象的所有REST請求/響應。到目前爲止一切正常。閱讀安卓春季攔截器中的響應正文

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

在初始化我打電話:

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

但是我不能在上面,因爲InputStream獲取使用一次,並拋出當以後再消耗一個IllegalStateException的方法登錄response.getBody()。有沒有辦法解決這個問題,以便我可以記錄響應主體呢?

回答

11

允許多個response.getBody()調用將您的ClientHttpRequestFactory包裝在BufferingClientHttpRequestFactory中。

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

使用3.1 Spring框架或更高版本,這絕對是一個更優雅的解決方案。 – Nachi

6

自己實施ClientHttpResponse並添加setBody(byte[] body)方法並覆蓋getBody。在上面的代碼中,可以將字節數組存儲在ByteArrayInputStream中,記錄你想要的內容,然後將字節數組放回到實現ClientHttpResponse的類的實例中,然後可以返回。