【问题标题】:Multiple Api request using RxJava and Retrofit使用 RxJava 和 Retrofit 的多个 Api 请求
【发布时间】:2021-09-04 05:05:23
【问题描述】:

我使用 Retrofit 和 RxJava 从远程服务器获取热门电影列表。每部电影都有一些信息,但我需要有关电影的更多信息,我可以通过传递 movie_id 的另一个请求来做到这一点,并且我会收到有关我通过的 id 的电影的更多信息。例如,我需要电影的类型,但从第一个电影信息请求开始,我只有类型的 ID,如果我将使用电影 ID 发出另一个请求,我将获得有关电影的更多信息,并且有包含类型及其 ID 的对象列表。如何将两个请求合并到一个对象中?

第一次请求的数据

我传递movie_id并获取流派的第二个请求的数据

来自我请求信息较少的电影的存储库中的代码

class MoviesRepositoryImpl(
    private val schedulersIO: Scheduler,
    private val moviesApi: MoviesApi,
    private val moviesApiMapper: MoviesApiMapper
): MoviesRepository {

    override fun getPopularMovies(): Single<List<PopularMovieModel>> {
        return moviesApi.getPopularMovies()
            .subscribeOn(schedulersIO)
            .map { moviesApiMapper.mapPopularMoviesApiToModelList(it) }
    }
}

【问题讨论】:

    标签: retrofit rx-java


    【解决方案1】:

    为此,您可以使用flatMap 运算符和两个参数:

    getPopularMovies()
        .map { 
            it[0] // get respective movie, in this case I just get a first movie in the list 
        }.flatMap( {  
            movie ->  api.getMovieDetails(movie.id) //request for movie details 
                }, { movie, details ->  DetailedMovieModel(movie, description)}
           )
    

    【讨论】:

      【解决方案2】:

      我找到了这个解决方案

        private fun getPopularMovies(): Single<List<Result>> {
              return moviesApi.getPopularMovies()
                  .map { it.results }
      
          }
      
          private fun getMovieDetailsList(): Single<List<MovieDetailsModelApi>> {
      
              return moviesApi.getPopularMovies().toObservable()
                  .flatMapIterable {
                      it.results
                  }
                  .flatMap {
                      moviesApi.getMoviesDetails(it.id).toObservable()
      
                  }
                  .toList()
          }
      
         override fun getMoviesWithDetails() :Single<List<PopularMovieWithDetailsModel>>{
              return Single.zip(getPopularMovies(),getMovieDetailsList()) { movieList, detailsList ->
                  moviesApiMapper.mapMovieDetailsAndMoviesToModelList(detailsList, movieList)
              }
                  .subscribeOn(schedulersIO)
      
          }
      

      【讨论】:

        猜你喜欢
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 2021-11-25
        • 2015-07-26
        • 2015-06-26
        相关资源
        最近更新 更多