gpt4 book ai didi

java - 基于 RxJava 和游标的 RESTful 分页

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:12:25 24 4
gpt4 key购买 nike

我正在使用 Spotify API 并希望使用 RxJava 链接一些分页结果。 Spotify 使用基于光标的分页,所以像 the one from @lopar 这样的解决方案将不起作用。

响应来自this call看起来像这样(假设有 50 个 items ):

{
"artists" : {
"items" : [ {
"id" : "6liAMWkVf5LH7YR9yfFy1Y",
"name" : "Portishead",
"type" : "artist"
}],
"next" : "https://api.spotify.com/v1/me/following?type=artist&after=6liAMWkVf5LH7YR9yfFy1Y&limit=50",
"total" : 119,
"cursors" : {
"after" : "6liAMWkVf5LH7YR9yfFy1Y"
},
"limit" : 50,
"href" : "https://api.spotify.com/v1/me/following?type=artist&limit=50"
}
}

现在,我使用改造获得了前 50 个这样的结果:

public class CursorPager<T> {
public String href;
public List<T> items;
public int limit;
public String next;
public Cursor cursors;
public int total;

public CursorPager() {
}
}

public class ArtistsCursorPager {
public CursorPager<Artist> artists;

public ArtistsCursorPager() {
}
}

然后

public interface SpotifyService  {

@GET("/me/following?type=artist")
Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit);

@GET("/me/following?type=artist")
Observable<ArtistsCursorPager> getFollowedArtists(@Query("limit") int limit, @Query("after") String spotifyId);

}

mSpotifyService.getFollowedArtists(50)
.flatMap(result -> Observable.from(result.artists.items))
.flatMap(this::responseToArtist)
.sorted()
.toList()
.subscribe(new Subscriber<List<Artist>>() {
@Override
public void onNext(List<Artist> artists) {
callback.onSuccess(artists);
}
// ...
});

我想返回 callback.success(List<Artist>) 中的所有(在本例中为 119 位)艺术家.我是 RxJava 的新手,所以我不确定是否有聪明的方法来做到这一点。

最佳答案

递归解决方案的唯一问题是堆栈溢出问题。一种无需递归的方法是

Observable<ArtistsCursorPager> allPages = Observable.defer(() ->
{
BehaviorSubject<Object> pagecontrol = BehaviorSubject.create("start");
Observable<ArtistsCursorPager> ret = pageControl.asObservable().concatMap(aKey ->
{
if (aKey != null && aKey.equals("start")) {
return Observable.getFollowedArtists(50).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
} else if (aKey != null && !aKey.equals("")) {
return Observable.getFollowedArtists(50,aKey).doOnNext(page -> pagecontrol.onNext(page.cursors.after));
} else {
return Observable.<ArtistsCursorPager>empty().doOnCompleted(()->pagecontrol.onCompleted());
}
});
return ret;
});

查看 this question 的解决方案.

关于java - 基于 RxJava 和游标的 RESTful 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com