有一个' ResponseInterceptor' (作为其对应的RequestInterceptor)组件用于Retrofit?

时间:2014-12-01 14:23:02

标签: android retrofit okhttp

我正在使用Retrofit及其大部分组件,如ErrorHandler,Callbacks和RequestInterceptor等。但是我想念一些像ResponseInterceptor'这样的东西可以让我过滤或读取标题以通用方式作为中心点进行响应,而不是必须为每个服务调用设置回调。这是目前我知道如何实现这一目标的唯一方法,但不得不在非常服务调用上显式传递回调对象。

我想要的是对任何存在特定标头的响应采取行动,因此它就像一个通用对象(一个响应传感器')来分析每个响应。

有这样的事吗?或者更好的想法如何实现这一点,而无需在每次服务调用上设置Call​​back对象?

提前致谢!

1 个答案:

答案 0 :(得分:6)

由于Retrofit目前没有提供标准的方法,我设法通过修改retrofit.client.Clientretrofit.RestAdapter实施工作来实现,请参见下文:

1)定义拦截器的接口

import retrofit.client.Response;

public interface ResponseInterceptor {

   void intercept(Response response);
}

2)进行实施。

public class MyResponseInterceptor implements ResponseInterceptor {

  @Override
  public void intercept(Response response) {
    List<Header> headers = response.getHeaders();
    //... read the headers the way you like
  }
}

3)为客户实施装饰器:

 public final class ResponseInterceptorClient extends OkClient {
    private final ResponseInterceptor responseInterceptor;

    public ResponseInterceptorClient(OkHttpClient okHttpClient, ResponseInterceptor responseInterceptor) {
       super(okHttpClient);
       this.responseInterceptor = responseInterceptor;
    }

    @Override
    public Response execute(Request request) throws IOException {
        Response response = super.execute(request);
        doIntercept(response);
        return response;
    }

    private void doIntercept(Response response) {
        if (responseInterceptor != null) {
           responseInterceptor.intercept(response);
        }
    }
 }

4)然后将其传递给 RestAdapter

  RestAdapter.Builder restBuilder = new RestAdapter.Builder();
  //...
  restBuilder.setClient(new ResponseInterceptorClient(okHttpClient, new MyResponseInterceptor()));
  //...
  restAdapter = restBuilder.build();

它很简单,它可以很容易地由库提供,就像RequestInterceptor一样,直到它不是,这是一种方法。享受!

更新03/2016 :由于Retrofit 2.0不需要制作自己的ResponseInterceptor,因此您可以使用与其集成的OkHttp interceptors