2012-06-20 14 views
8

私はAndroidアプリケーションでRestTemplateオブジェクトのすべてのRESTリクエスト/レスポンスを記録するために単純なSpringインターセプタクラスを使用しています。これまでのところすべて正常に動作します。初期化時AndroidのSpringインターセプタでレスポンスボディを読む

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を実装するクラスのインスタンスにバイト配列を設定して戻すことができます。

関連する問題