retrofit2和rxjava - 如何在android中组合两个依赖的网络调用

时间:2016-09-24 20:31:54

标签: android rx-java retrofit2

我在理解如何将两个网络呼叫链接在一起时遇到了一些麻烦。我正在使用retrofit2和rxJava。我正在使用Yelp API,并且已经为我想要捕获的业务提供了gson Pojo。但api业务呼叫不包括评论,因此在我获得业务后,我必须进行另一次网络呼叫以获得评估(基于第一次呼叫的业务ID)。

所以我想要发生的是以下内容: 1.进行api调用以获取业务ID(给定用户提供的搜索词)。 2.完成后我需要使用商家ID来进行审核。

两者都是不同的api电话。

获取商家ID的一次调用如下所示:

https://api.yelp.com/v3/businesses/search?term=delis&latitude=37.786882&longitude=-122.399972

和另一个获得评论的电话是这样的:

https://api.yelp.com/v3/businesses/molinari-delicatessen-san-francisco/reviews

所以第二次调用取决于第一次调用的数据。

在retrofit2中,我将以下设置为服务:

   @GET("v3/businesses/search")
Observable<Businesses> getBusinessesRx(
        @Query("term") String term,
        @Query("latitude") String latitude,
        @Query("longitude") String longitude);

@GET("v3/businesses/{id}/reviews")
Observable<Businesses> getReviewsRx(
        @Path("id") String businessID);

但请注意我在两者中都使用了Businesses pojo。不确定我是否可以这样做。企业gson pojo是第一次通过电话会议(#1)来获得搜索字词。但我不会介意我是否可以为评论添加额外的字段以及如何填充。通过这种方式,我的商家课程可以针对发现的每项业务进

我不知道如何在RXjava中启动它。我知道我需要一个平面图,但我对使用的POJO以及如何使其工作有点困惑。这是在Android设备上。

如果需要,我的商家pojo看起来像这样:

public class Businesses {

@SerializedName("businesses")
@Expose
private List<Business> businesses = new ArrayList<Business>();
@SerializedName("total")
@Expose
private Integer total;

/**
 * 
 * @return
 *     The businesses
 */
public List<Business> getBusinesses() {
    return businesses;
}

/**
 * 
 * @param businesses
 *     The businesses
 */
public void setBusinesses(List<Business> businesses) {
    this.businesses = businesses;
}

/**
 * 
 * @return
 *     The total
 */
public Integer getTotal() {
    return total;
}

/**
 * 
 * @param total
 *     The total
 */
public void setTotal(Integer total) {
    this.total = total;
}

}

我的业务pojo(针对每个业务)看起来像这样:

public class Business {

@SerializedName("image_url")
@Expose
private String imageUrl;
@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("location")
@Expose
private Location location;
@SerializedName("rating")
@Expose
private Integer rating;
@SerializedName("price")
@Expose
private String price;
@SerializedName("categories")
@Expose
private List<Category> categories = new ArrayList<Category>();
@SerializedName("phone")
@Expose
private String phone;
@SerializedName("review_count")
@Expose
private Integer reviewCount;
@SerializedName("coordinates")
@Expose
private Coordinates coordinates;
@SerializedName("url")
@Expose
private String url;

/**
 * 
 * @return
 *     The imageUrl
 */
public String getImageUrl() {
    return imageUrl;
}

/**
 * 
 * @param imageUrl
 *     The image_url
 */
public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

/**
 * 
 * @return
 *     The id
 */
public String getId() {
    return id;
}

/**
 * 
 * @param id
 *     The id
 */
public void setId(String id) {
    this.id = id;
}

/**
 * 
 * @return
 *     The name
 */
public String getName() {
    return name;
}

/**
 * 
 * @param name
 *     The name
 */
public void setName(String name) {
    this.name = name;
}

/**
 * 
 * @return
 *     The location
 */
public Location getLocation() {
    return location;
}

/**
 * 
 * @param location
 *     The location
 */
public void setLocation(Location location) {
    this.location = location;
}

/**
 * 
 * @return
 *     The rating
 */
public Integer getRating() {
    return rating;
}

/**
 * 
 * @param rating
 *     The rating
 */
public void setRating(Integer rating) {
    this.rating = rating;
}

/**
 * 
 * @return
 *     The price
 */
public String getPrice() {
    return price;
}

/**
 * 
 * @param price
 *     The price
 */
public void setPrice(String price) {
    this.price = price;
}

/**
 * 
 * @return
 *     The categories
 */
public List<Category> getCategories() {
    return categories;
}

/**
 * 
 * @param categories
 *     The categories
 */
public void setCategories(List<Category> categories) {
    this.categories = categories;
}

/**
 * 
 * @return
 *     The phone
 */
public String getPhone() {
    return phone;
}

/**
 * 
 * @param phone
 *     The phone
 */
public void setPhone(String phone) {
    this.phone = phone;
}

/**
 * 
 * @return
 *     The reviewCount
 */
public Integer getReviewCount() {
    return reviewCount;
}

/**
 * 
 * @param reviewCount
 *     The review_count
 */
public void setReviewCount(Integer reviewCount) {
    this.reviewCount = reviewCount;
}

/**
 * 
 * @return
 *     The coordinates
 */
public Coordinates getCoordinates() {
    return coordinates;
}

/**
 * 
 * @param coordinates
 *     The coordinates
 */
public void setCoordinates(Coordinates coordinates) {
    this.coordinates = coordinates;
}

/**
 * 
 * @return
 *     The url
 */
public String getUrl() {
    return url;
}

/**
 * 
 * @param url
 *     The url
 */
public void setUrl(String url) {
    this.url = url;
}

}

1 个答案:

答案 0 :(得分:3)

我不确定我是否理解正确,但从第一次致电您收到的商家名单以及您需要接受审核的每个商家名单。如果是这样,您可以使用以下代码:

ApiService service = Retrofit.create(ApiService.class);
service.getBusinessesRx("delis", "37.786882", "-122.399972")
        .map(Businesses::getBusinesses)
        .flatMap(Observable::from)
        .map(Business::getId)
        .flatMap(service::getReviewsRx)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(businesses -> updateUi());