2012-06-20 29 views
8

Tôi đang sử dụng lớp Spring Interceptor đơn giản để ghi lại tất cả các yêu cầu/phản hồi REST cho đối tượng RestTemplate trong ứng dụng Android của tôi. Cho đến nay tất cả mọi thứ hoạt động tốt.Đọc nội dung phản hồi trong Bộ chặn Android của Android

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

Tại khởi tôi gọi:

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

Tuy nhiên tôi không thể đăng nhập response.getBody() trong các phương pháp trên vì InputStream được tiêu thụ một lần và ném một IllegalStateException khi nó được tiêu thụ lại sau. Có cách nào xung quanh điều này để tôi có thể đăng nhập cơ thể phản ứng quá?

Trả lời

11

Để cho phép nhiều cuộc gọi response.getBody() bao bọc ClientHttpRequestFactory của bạn trong BufferingClientHttpRequestFactory.

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

Sử dụng khung công tác Spring 3.1 trở lên, đây chắc chắn là giải pháp thanh lịch hơn. – Nachi

6

Triển khai ClientHttpResponse chính mình và thêm phương thức setBody(byte[] body) và ghi đè getBody. Trong mã của bạn ở trên, bạn có thể lưu trữ mảng byte trong một ByteArrayInputStream, đăng nhập những gì bạn muốn, sau đó đặt mảng byte trở lại trong trường hợp của lớp của bạn thực hiện ClientHttpResponse và sau đó bạn có thể quay lại.

Các vấn đề liên quan