簡體   English   中英

Jersey RxJava客戶端和資源端點的集合

[英]Jersey RxJava client and collection of resource endpoints

我對RxJava非常陌生,我仍在嘗試了解數據流,但是我想知道是否有可能在繼續深入研究之前。

目標:分離API資源並允許它們進行分配,以及為客戶端(Web /移動設備)提供靈活性,以基於僅提供給一些“已知” API端點的href鏈接來獲取數據。

我從一個API中收集了JSON對象,其中每個json都有一個“ href”字段,該字段提供指向API資源的鏈接,可以在其中檢索數據的全部詳細信息。 例如:

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

檢索此集合后,我想使用該href值調用適當的資源,並將結果存儲在JSON數組等集合中。

我將JSON對象列表中的字符串映射到另一個列表中,然后嘗試將它們添加到Observable中,以便可以異步地將每個資源檢索到相同的響應中。

我一直在使用Jersey示例作為參考,但我擔心它無法獲取動態href鏈接並返回我想要的響應。

到目前為止,我停在:

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

我很猶豫將其放入for循環中,以便為每個hrefLinks條目創建Observable。

如何將來自多個資源的響應轉換為客戶端的單個一致響應?

flatMap運算符是您要找的東西。 您可以在流中發出href鏈接,以便在flatMap運算符中將每個鏈接轉換為一個新的observable,並將其結果傳播到原始流中。 我認為這正是您所描述的行為。

編輯:翻新庫提供了一個不錯的接口,可以從鏈接創建可觀察對象。 要詳細說明您的示例,您首先需要使用map運算符將集合對象轉換為某種Iterable。 一旦你有一個interable,使用flatMap創建一個可觀察使用屬於可迭代的項目Observable.from() 這將以單獨的發射方式發射鏈接。 然后,您再次使用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 */ )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM