多个API调用来创建对象



比如说,我有一个类:

public class NI {
   private int id;
   @SerializedName("date")
   private String created_at;
   private String slug;
   private String type;
   private String link;
   private WPTitle title;
   private WPContent content;
   private WPExcerpt excerpt;
   @SerializedName("author")
   private int authorId;
   private int featured_media;
   private WPMedia media;
   List<Integer> categories;
}

和另一个类:

public class WPMedia {
  private int id;
  private String media_type;
  private String mime_type;
  private String source_url;
}

问题是WPMedia将需要基于int featured_media值的单独API调用。我如何建立一个可观察的链,使其获得NI类,然后另一个获得WPMedia,然后将其设置在对象上?

我使用Retrofit使API调用像这样:

@GET("wp-json/wp/v2/posts")
Observable<ArrayList<NI>>getPostsObservableByCategory(@Query("categories") int category, @Query ("per_page") int limit, @Query("page") int skip);
@GET("wp-json/wp/v2/media/{id}")
Observable<WPMedia> getMediaObservable(@Path("id") int id);

我还不完全清楚你到底想要什么,但我会试试的。

我首先做的一个假设是,在NI上你有一个签名为public void setWPMedia(WPMedia media)的setter。鉴于您给出的两个Retrofit函数定义,我建议您执行以下操作:

getPostsObservableByCategory(...)
  .flatMap(nis -> getMediaObservable(...)
    .first()
    .doOnNext(m -> nis.foreach(ni -> ni.setWPMedia(m)))
    .map(m -> nis));

逐行浏览:

  • getPostsObservableByCategory(...)给出一个Observable,它发出NI实例的列表。这些列表中每个NI上的media字段可能已经设置,也可能没有设置。
  • getMediaObservable(...)获取需要在上设置相应列表中每个元素的WPMedia实例。
  • 我将getMediaObservable的排放量限制为1,否则NI中的字段将被设置多次,我认为这是不可取的。如果getMediaObservable(...)函数/实现已经保证了这一点,可以省略这一行。
  • 设置字段被认为是一个副作用,所以我们在这里需要doOnNext,其中我们循环NI实例列表并将WPMedia字段设置为从getMediaObservable获得的字段。
  • 我假设你想有NI实例的列表之后,所以我添加了一个map,只是取代m与该列表。

希望这对你有所帮助!

我给你找了一个演示!!我认为你可以这样做:

@GET("/token")
public Observable<String> getToken();
@GET("/user")
public Observable<User> getUser(@Query("token") String token, @Query("userId") String userId);
...
getToken()
.flatMap(new Func1<String, Observable<User>>() {
    @Override
    public Observable<User> onNext(String token) {
        return getUser(token, userId);
    })
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<User>() {
    @Override
    public void onNext(User user) {
        userView.setUser(user);
    }
    @Override
    public void onCompleted() {
    }
    @Override
    public void onError(Throwable error) {
        // Error handling
        ...
    }
});

博客链接

相关内容

  • 没有找到相关文章

最新更新