多个改造相关的请求

时间:2017-10-31 06:08:22

标签: android retrofit rx-java

我有这样的模型(我无法改变)

public class Container {
   private int id
   private List<Item> items
}

项目类如下所示:

public class Item {
    private int something;
    private Owner owner;
}

所有者类看起来像这样:

public class Owner {
    private String login;
    private String url;
    private String name;
}

问题是一个请求(不是我的,无法更改)获取一个包含所有项目的Container,而其所有者只获取login和url属性(在此示例中)。此调用不会检索name属性。

我必须使用login参数发出另一个请求以获取所有者的名称。并更新我的模型以填充此属性,以便稍后我可以使用项目列表(使用所有者名称)。

我是改装的新人,不知道rxJava,但我环顾四周,无法想出这个。

这是我到目前为止所做的:

界面

public interface SomeService {
     @GET("somerlToGetContainerWithItems")
     Observable<Container> getContainer();

     @GET("url/{login}")
     Observable<Owner> getOwner(@Path("login") String login);
}

api客户端

public static Retrofit getClient() {
    retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
}

关于主要活动,我有这个代码;

service = client.getClient().create(Service.class);

private Observable<Container> getContainer() {
    return service.getContainer();
}

private Observable<Owner> getOwner(Item item) {
    return service.getOwner(item.getOwner().getLogin());
}

getContainer()
            .flatMap(r-> Observable.just(r.getItems()))
            .flatMap(new Func1<Item, Observable<? extends Owner>>() {
                @Override
                public Observable<? extends Owner> call(Item response) {
                    return getOwner(response);
                }
            }, new Func2<List<Item>, Owner, List<Item>>() {
                @Override
                public List<Item> call(List<Item> items, Owner owner) {
                  // dont know how to return the list of items again
                  // with the owner name
                }
            });

所以基本上我必须根据每个项目发出第二个请求,然后返回这个项目列表,但是使用所有者名称。

1 个答案:

答案 0 :(得分:0)

[KOTLIN] 对于未来的人:)

    class PanelActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_instructor_panel)
    
            val token = intent.extras?.getString(TOKEN)
            val bearerToken = "Bearer $token"
            val sharedPreferences = getSharedPreferences(ID, Context.MODE_PRIVATE)
    
// here I use my second request
            postItem(token, bearerToken, sharedPreferences)
    
    
        }
    
        fun postItem(token: String?, bearerToken: String, sharedPreferences: SharedPreferences) {
            val id= getID(token)
    
            RetrofitClient.sendNetworkRequest.getId(id.toString(), bearerToken).enqueue(object : Callback<Your_Object> {
                override fun onResponse(
                    call: Call<Your_Object>,
                    response: Response<Your_Object>) {
                    if (response.isSuccessful) {
                       
                   
                        preparePost(token, bearerToken, sharedPreferences)
                 
                }
    
                override fun onFailure(call: Call<Your_Object>, t: Throwable) {
                    // on failure
                }
            })
        }
    
        fun preparePost(token: String?, bearerToken: String, sharedPreferences: SharedPreferences){
    
           
    
            RetrofitClient.sendNetworkRequest.getAllRides(id, bearerToken).enqueue(object : Callback<Your_Object> {
                override fun onResponse(call: Call<Your_Object>, response:Response<Your_Object>) {
                    if (response.isSuccessful) {
                       // on response if successful
                        } 
                        }
                    }
                }
    
                override fun onFailure(call: Call<Your_Object>, t: Throwable) {
                   // on failure
                }
            })
    
        }

如您所见,我需要发布请求,将一些ID放入sharedPreferences,然后将保存的值用于新请求中。 只需执行其他功能,然后在Response上调用第一个请求即可。