Retrofit是否有'ResponseInterceptor'(作为其对应的RequestInterceptor)组件?

Alé*_*lho 1 android retrofit okhttp

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

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

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

提前致谢!

Alé*_*lho 6

由于改造目前不提供这样做的标准方法,我设法让它通过装饰工作retrofit.client.Client被赋予执行retrofit.RestAdapter,看到它下面:

1)定义拦截器的接口

import retrofit.client.Response;

public interface ResponseInterceptor {

   void intercept(Response response);
}
Run Code Online (Sandbox Code Playgroud)

2)实现它.

public class MyResponseInterceptor implements ResponseInterceptor {

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

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);
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

4)然后将其传递给RestAdapter:

  RestAdapter.Builder restBuilder = new RestAdapter.Builder();
  //...
  restBuilder.setClient(new ResponseInterceptorClient(okHttpClient, new MyResponseInterceptor()));
  //...
  restAdapter = restBuilder.build();
Run Code Online (Sandbox Code Playgroud)

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

更新03/2016:由于Retrofit 2.0不需要创建自己的ResponseInterceptor,您可以使用与其集成的OkHttp拦截器.