我有一个返回分页响应的API。我已经构建了一个可以用作
的CallAdapter@GET("books")
PaginatedCall<Book> getBooks();
然后将其用作
List<Book> firstPageOfBooks = getBooks().execute();
或
getBooks().enqueue(new Callback() {
void onResponse(List<Book> books) {
...
}
});
并返回第1页上的书籍列表。但我希望能够获取结果的第二页,而且我还希望能够获取所有页面结果,只使用CallAdapter。所以我希望能够致电
List<Book> secondPage = getBooks().getPage(2);
甚至
List<Book> allBooks = getBooks().allPages();
getBooks().enqueueAllPages(new Callback() {
void onResponse(List<Book> allBooks) {
...
}
});
等
(我知道我可以写
@GET("books")
PaginatedCall<Book> getBooks(@Query("page") int page);
但我有很多这样的端点并且认为它很混乱,我不能使用这种技术编写allPages
方法。)
为了正确地做到这一点,我希望能够在CallAdapter的execute()方法中获取Call
对象,并为请求添加参数。我现在有一个丑陋的方法,我可以获得call.request().newBuilder()
,向URL添加参数,然后使用OkHttpClient发出请求 - 这会获得我想要的API,但是绕过它感觉不对以这种方式改造。这也意味着,因为我不再能访问call.enqueue
,我必须管理我自己的ThreadPool,呼叫取消需要大量的手工工作等。
理想情况下,我想这样做:
Call<..> newCall = myCall.builder().request(newRequest).build();
newCall.enqueue( ... );
有没有什么方法可以在代码中创建一个新的Call,而不是只是在改装我的东西?
我可以使用NetworkInterceptor更改请求,以便可能工作,但是无法将信息从CallAdapter发送到NetworkInterceptor(并且感觉很奇怪)。