在Retrofit CallAdapter中更改请求

时间:2018-03-30 22:31:58

标签: retrofit2

我有一个返回分页响应的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(并且感觉很奇怪)。

0 个答案:

没有答案