2014-11-10 16 views
18

Próbuję przekonwertować moją aplikację, która obecnie używa funkcji Retrofit, do korzystania z Java RX. Aby obsłużyć paginację, tradycyjnie pobierałem adres URL strony next z nagłówków odpowiedzi.Uzyskiwanie informacji o nagłówku za pomocą RXJava i Retrofit

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

Jednak od czasu przejścia na Java RX, nie jestem pewien, jak uzyskać informacje o odpowiedzi z mojego połączenia modernizacji.

Czy istnieje sposób na uzyskanie moich połączeń modernizacyjnych w celu zwrócenia informacji z mojego nagłówka wraz z obiektami Typed?

Odpowiedz

3

Pozwól mi spoiler tego. Możesz przechwycić żądanie i odpowiedź od OkHttp-2.2. Tak jak w przypadku OkHttp wiki, interceptory nie będą działały w Retrofit z OkUrlFactory. Trzeba zapewnić implementację Client wykonać Retrofit wnioski na temat tego custom Client i jest bezpośrednio na OkHttp

Niestety, to nie jest się jeszcze (wkrótce).

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

Zastosowanie:

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

To przechwytujących aplikacji i zostanie wywołana tylko raz.

Proszę zauważyć, że zrobiłem to wszystko logicznie, nadal nie mam OkHttp-2.2. Przeczytaj o tym here. Usuwam część tego tekstu, gdy 2.2 jest najnowszym słojem.

Alternatywnie, można spróbować stworzyć własny klienta oraz z jednego interfejsu dostarczyć odpowiedź:

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 został released.

13

Można użyć

Observable<Response> 

jako typ zwracany, aby uzyskać szczegółowe odpowiedzi

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

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

ten sposób obiekt Response będzie wyglądać

enter image description here

byś następnie przeanalizować nagłówki i ciało z obserwowalnego

+0

Używanie tego typu obserwowalnego utrudnia dwa połączenia zip, przynajmniej z tego, co mogę powiedzieć. Czy jest jakiś inny sposób? – Brandon

+0

o sprawdzaniu, czy odpowiedź zakończyła się pomyślnie() ?? – orium

Powiązane problemy