使用RXJava和Retrofit获取标题信息

时间:2014-11-10 19:28:56

标签: android retrofit rx-java

我试图转换目前使用Retrofit的应用程序,以使用RX Java。 为了处理分页,我传统上是从响应头中抓取nextPage URL。

@Override
    public void success(Assignment assignment, Response response) {
        response.getHeaders(); // Do stuff with header info
}

但是,由于切换到RX Java,我不知道如何从我的改装电话中获取响应信息。

   @GET("/{item_id}/users")
    Observable<List<Objects>> getObjects(@Path("object_id") long object_id);

    @GET("/{next}")
    Observable<List<Objects>> getNextPageObjects(@Path("next") String nextURL);

有没有办法让我的改装调用将我的标题信息与我的Typed对象一起返回?

1 个答案:

答案 0 :(得分:3)

让我扰乱这一点。您可以截取 OkHttp-2.2 中的请求和响应。与OkHttp wiki上一样,拦截器不会在Retrofit中与OkUrlFactory一起使用。您需要提供Client实施,以便custom Client直接Retrofit

执行OkHttp次请求

不幸的是,它还没有(很快)。

public class ResponseHeaderInterceptor implements Interceptor {
  public interface ResponseHeaderListener{
     public void onHeadersIntercepted(Headers headers);
  }
  private ResponseHeaderListener mListener;
  public ResponseHeaderInterceptor(){};
  public ResponseHeaderInterceptor(ResponseHeaderListener listener){
     mListener = listener;
  }
  @Override public Response intercept(Chain chain) throws IOException {
    Response response = chain.proceed(chain.request());
    if(mListener != null){
       mListener.onHeadersIntercepted(response.headers());
     }
    return response;
  }

用法:

ResponseHeaderListener headerListener = new ResponseHeaderListener(){
 @Override
 public void onHeadersIntercepted(Headers headers){
     //do stuff with headers
 }
};
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new ResponseHeaderInterceptor(headerListener));
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder();
restAdapterBuilder.setClient(new OkHttpClient22(okHttpClient));

这是应用程序拦截器,只会被调用一次。

请注意我通过逻辑做了所有这些,我仍然没有OkHttp-2.2。请阅读它here。当2.2是最新的jar时,我会删除一些文本。

或者,您可以尝试创建自定义客户端,并使用一个界面提供响应:

public class InterceptableClient extends OkClient {
    private ResponseListener mListener;
    public interface ResponseListener{
        public void onResponseIntercepted(Response response);
    }
    public InterceptableClient(){};
    public InterceptableClient(ResponseListener listener){
        mListener = listener;
    }
    @Override
    public retrofit.client.Response execute(Request request) throws IOException {
        Response response =  super.execute(request);
        if(mListener != null) //runs on the executor you have provided for http execution
            mListener.onResponseIntercepted(response);
        return response;
    }
}

修改:OkHttp 2.2已经released