Подтвердить что ты не робот

Получение информации заголовка с помощью RXJava и дооснащения

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

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

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

4b9b3361

Ответ 1

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

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 будет выглядеть как

введите описание изображения здесь

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

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

}

Ответ 2

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

Изменить: OkHttp 2.2 был выпущен.