web-dev-qa-db-ja.com

RXJavaとRetrofitを使用したヘッダー情報の取得

現在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オブジェクトと一緒にヘッダー情報を返すようにレトロフィット呼び出しを行う方法はありますか?

20
user3169791

使用できます

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

}
17
3xplore

これをネタバレさせてください。 OkHttp-2.2の時点で要求と応答をインターセプトできます。 OkHttp wiki のように、インターセプターはRetrofitOkUrlFactoryでは機能しないと言っています。この カスタムクライアント および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は リリース済み です。

3