Получение информации заголовка с помощью 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);
Есть ли способ, чтобы мои вызовы по переоснащению возвращали мою информацию заголовка вместе с моими типизированными объектами?
Ответы
Ответ 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 был выпущен.