gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:32:17 24 4
gpt4 key购买 nike

我在理解如何将两个网络调用链接在一起时遇到了一些问题。我正在使用 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 以及如何使其工作感到有点困惑。这是在安卓设备上。

如果需要,我的业务 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;
}

最佳答案

我不确定我的理解是否正确,但从第一次通话开始,您会收到一份业务 list ,而对于每一项业务,您都需要进行审核。如果是这样,您可以使用以下代码:

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

关于android - retrofit2 和 rxjava - 如何在 android 中组合两个依赖的网络调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39680710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com