2017-01-12 6 views
0

私はRxJavaを非常に新しくしていますが、私はまだデータの流れを理解しようとしていますが、これが可能かどうかを知りたければ、ジャージRxJavaクライアントとリソースエンドポイントのコレクション

ゴール: APIリソースをデカップリングして配布できるようにするとともに、いくつかの「既知の」APIに提供されるhrefリンクに基づいてクライアント(Web /モバイル)にデータをフェッチする柔軟性を提供します。エンドポイント。

各JSONには、APIリソースへのリンクを提供する 'href'フィールドがあり、データの完全な詳細を取得できる1つのAPIからJSONオブジェクトのコレクションがあります。たとえば:

{ 
    { 
     name: "assassins_creed", 
     href: "games/assassins_creedId123" 
    }, 
    { 
     name: "bioshock", 
     href: "games/bioshockId456" 
    }, 
    { 
     name: "clean_code", 
     href: "books/clean_codeId789" 
    }, 
    { 
     name: "christmas", 
     href: "events/xmas001" 
    } 
} 

このコレクションを検索した後、私はそのようなJSON配列としてそのhrefの値を使用して、適切なリソースへの呼び出しを行うと、コレクションに結果を格納したいと思います。

私は、JSONオブジェクトのリストから別のリストにマッピングしています。そして、それらをObservableに追加しようとしています。これにより、各リソースを非同期に同じレスポンスに取り出すことができます。

私は参照としてJersey exampleを使用していましたが、私は動的hrefリンクを取れず、私が望む応答を返すことができないと懸念しています。私は、各hrefLinksエントリの観測を作成するためのループにこれを入れて躊躇した

@Override 
public List<JSONObject> getUsersDashboard(TokenModel token, String userId, @Suspended final AsyncResponse async) { 
    List<JSONObject> list = //Database request to get items for userId 
    List<String> hrefLinks = list.stream() 
      .map(e -> (String) e.get("href")) 
      .collect(Collectors.toList()); 

    final Queue<String> errors = new ConcurrentLinkedQueue<>(); 

    Observable.just(new JSONArray()) 
      .zipWith(dashboard(token.getAccessToken(),"plhUrl", errors), (array, objects) -> { 
       array.add(objects); 
       return array; 
      }) 
      .subscribe(response -> { 
       //errors? 
       async.resume(response); 
      }, async::resume); 
} 

private Observable<List<JSONObject>> dashboard(String access, String urlFragment, Queue<String> errors) { 
    Client client = ClientBuilder.newClient(); 
    return RxObservable.from(client).target(urlFragment).request() 
      .header("Authorization", access) 
      .rx() 
      .get(new GenericType<List<JSONObject>>(){}) 
      .onErrorReturn(throwable -> { 
       errors.offer(throwable.getMessage()); 
       return Collections.emptyList(); 
      }); 
} 

は、これまでのところ私はで停止しました。

複数のリソースからの応答を、クライアントの単一の一貫性のある応答にするにはどうすればよいですか?

答えて

0

flatMap演算子はあなたが探しているものです。フラットマップ演算子では、各リンクを新しい観測値に変換し、その結果を元のストリームに伝播させるように、ストリーム内のhrefリンクを出力することができます。私はこれがまさにあなたが説明した行動だと思う。

編集: Retrofitライブラリは、リンクからオブザーバブルを作成するための素晴らしいインターフェイスを提供します。あなたの例をもっと詳しく説明するには、まずコレクションオブジェクトをmap演算子を使ってある種のIterableに変換する必要があります。インタラブルができたら、Observable.from()を使用して、Iterableに属するアイテムのオブザーバブルを作成するには、flatMapを使用します。これにより、リンクが別々の排出物として排出されます。 flatMapを再度使用して、各リンクをネットワーク要求の観測可能なものに変換します。この要求は、放射を元のストリームに戻します。

getCollectionObjectObservable() 
    .map(result -> iterable) // transform the object into Iterable(ie. List) 
    .flatMap(iterable -> Observable.from(iterable)) 
    .flatMap(link -> createRequestObservable(link)) 
    .subscribe(result -> /* process the result of each item here */) 
+0

getCollectionObjectObservable():これはRetrofitライブラリのメソッドですか? – fakataha

+0

もう少し仕事をして助けてもらえました。 – fakataha

関連する問題