如何使用Reform和RxJava对餐馆重试相同的搜索查询,以从Google Map Api获得下一页的结果



我正在请求谷歌地图,使用附近搜索Api获取餐馆列表。https://developers.google.com/maps/documentation/places/web-service/search-nearby服务器通过最多包含20个结果的页面发送响应。如果有额外的页面可用,则会设置jsonnext_page_token属性,其中包含要作为参数传递给下一次搜索的值。使用改装和RxJava,我知道如何进行第一次搜索,并获得next_page_token。但我不知道如何重试相同的请求。任何帮助都将不胜感激。

public Observable<PlaceNearbySearch> streamFetchRestaurants(String location, int radius, String type) {
// search for the list of restaurants
RestoApi restoApi = RetrofitBuilder.getRetrofit().create(RestoApi.class);
return restoApi.getRestoFirsttPage(location, radius, type, GOOGLE_MAP_API_KEY) 
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(10, TimeUnit.SECONDS);
}
public Observable<PlaceDetail> streamFetchDetails(String placeId) {
// search details for each restaurants of the list
RestoApi restoApi = RetrofitBuilder.getRetrofit().create(RestoApi.class);
return restoApi.getPlaceDetails(placeId, GOOGLE_MAP_API_KEY)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.timeout(10, TimeUnit.SECONDS);
}
public Single<List<PlaceDetail>> streamFetchRestaurantDetails(String location, int radius, String type) {
// chains the 2 previous requests
return streamFetchRestaurants(location, radius, type)
.flatMapIterable(new Function<PlaceNearbySearch, List<PlaceNearbySearchPlace>>() {
@Override
public List<PlaceNearbySearchPlace> apply(PlaceNearbySearch placeNearbySearch) throws Exception {
// Is next_page_token set?
// In case it is, how would you query the next page??
Log.d(TAG, "apply: next_page_token: " + placeNearbySearch.getNext_page_token());
return placeNearbySearch.getResultSearches();
}
})
.flatMap(new Function<PlaceNearbySearchPlace, Observable<PlaceDetail>>() {
@Override
public Observable<PlaceDetail> apply(PlaceNearbySearchPlace placeNearbySearchPlace) throws Exception {
return streamFetchDetails(placeNearbySearchPlace.getPlaceId());
}
})
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
private void test_streamFetchRestaurantDetails() throws InterruptedException {
// test method
String location = "48.854685336064264, 2.3467574997969596";
int radius = 1500;
String type = "restaurant";
callstreamFetchRestaurantDetails(location, radius, type);
}
private void callstreamFetchRestaurantDetails(String location, int radius, String type) {
streamFetchRestaurantDetails(location, radius, type)
.subscribe(new DisposableSingleObserver<List<PlaceDetail>>() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull List<PlaceDetail> placeDetails) {
// handle list of placeDetails
}
@Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
Log.d(TAG, "onError: " + e.getMessage());
}
});
}

您需要使用;next_page_token";这将返回您接下来的20个结果。如果没有更多可用的结果,它将不会向您发送next_page_token。请检查此文档以了解此令牌的使用情况。

最新更新