![](/img/trans.png)
[英]RxJava jersey client with proxy built with WebResourceFactory
[英]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.