2016-09-24 3 views
2

2つのネットワークコールをどのように連鎖させることができるか理解できています。 retrofit2とrxJavaを使用しています。私はYelp APIを使用しており、キャプチャしたいビジネスのためのgson Pojoを既に持っています。しかし、ビジネスのためのAPI呼び出しにはレビューが含まれていないので、ビジネスを取得した後、別のネットワークコールを使ってレビューを取得する必要があります(最初の呼び出しからビジネスIDに基づいて)。retrofit2とrxjava - アンドロイドで2つの従属ネットワークコールを結合する方法

私は何が起こりたいのですか: 1.ビジネスIDを取得するためにAPI呼び出しを行います(指定された検索語ユーザーが指定されている場合)。 2.完了後、私はビジネスIDを使用してレビューを取得する必要があります。

両方とも異なるAPIコールです。ビジネスIDを取得するために

1呼び出しは次のようになります。

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); 

をしかし、私は両方で企業のPOJOを使用しています注意してください。私はそれをすることができるかどうかは分かりません。ビジネスgson pojoは、検索用語を与えられた企業のグループを得るための最初の呼び出し(#1)です。しかし、もし私がレビューのための余分なフィールドとそれをどのように人口に埋めることができれば、私は気にしません。このようにして、私のビジネスクラスは見つけられたすべてのビジネスについてレビューを受けることができます。

これをRXjavaでどのように起動するのかよくわかりません。私はフラット・マップが必要だと知っていますが、使用するPOJOとそれを動作させる方法について少し混乱します。これはアンドロイドデバイス上にあります。

必要であれば、私企業の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; 
} 

}

答えて

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()); 
関連する問題