2014-11-10 2 views
18

Я пытаюсь преобразовать свое приложение, которое в настоящее время использует Retrofit, для использования RX Java. Чтобы обрабатывать разбиение на страницы, я традиционно захватывал URL следующей страницы из заголовков ответов.Получение информации заголовка с RXJava и дооснащением

@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); 

Есть ли способ, чтобы мои обратные вызовы возвращали мою информацию заголовка вместе с моими типизированными объектами?

ответ

3

Позвольте мне спойлером. Вы можете перехватить запрос и ответ от OkHttp-2.2. Как и в случае с OkHttp wiki, перехватчики не будут работать в Retrofit с OkUrlFactory. Вы должны предоставить свой Client реализации для выполнения Retrofit запросов об этом custom Client и непосредственно на 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 - последняя банка.

В качестве альтернативы, вы можете попробовать создать собственный клиент и с одним интерфейсом доставить ответ:

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

Edit: OkHttp 2.2 был released.

13

Вы можете использовать

Observable<Response> 

в качестве возвращаемого типа, чтобы получить детали ответа

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

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

Это как объект Response будет выглядеть

enter image description here

Вы имели бы затем разобрать заголовки и тело из наблюдаемого

serviceClass.getNextPageObjects("next").flatMap(new Func1<Response, Observable<List<Objects>>() { 
    @Override 
    public Observable<AuthState> call(Response response) { 
     List<Header> headers = response.getHeaders(); 
     GsonConverter converter = new GsonConverter(new Gson()); 
     // you would have to change this to convert the objects to list 
     List<Objects> list = converter.fromBody(response.getBody(), 
          YourClass.class); 

     return Observable.from(list); 
    } 

} 
+0

Использование этого типа наблюдаемых затрудняет два вызова zip вместе, по крайней мере, из того, что я могу сказать. Есть ли другой путь? – Brandon

+0

как насчет проверки, если ответ isSuccessful() ?? – orium

Смежные вопросы