現在Retrofitを使用しているアプリをRXJavaを使用するように変換しようとしています。ページネーションを処理するために、私は従来、応答ヘッダーからnextPageURLを取得していました。
@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オブジェクトと一緒にヘッダー情報を返すようにレトロフィット呼び出しを行う方法はありますか?
使用できます
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);
}
}
これをネタバレさせてください。 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が最新のjarである場合、このテキストの一部を削除します。
または、カスタムクライアントを作成して、1つのインターフェイスで応答を配信することもできます。
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は リリース済み です。