Динамически добавлять необязательные параметры в запросы API
У меня есть приложение для Android, которое взаимодействует с API REST.
Для каждого запроса я хочу, чтобы мое приложение могло добавлять необязательные параметры в дополнение к обязательным параметрам.
Как я могу реализовать это с помощью Retrofit? В настоящее время все параметры жестко закодированы в интерфейсе:
@GET("/user/{id}/comments?position={pos}")
void getComments(@Path("id") int id, @Query("pos") int pos, Callback<String> cb);
@GET("/user/{id}/likes?n={number}")
void getLikes(@Path("id") int id, @Query("number") int number, Callback<String> cb);
/* etc */
Возможно ли "подкласс" RestAdapter
или что-то иметь возможность динамически добавлять необязательные параметры в мои запросы?
Ответы
Ответ 1
У вас есть несколько способов добиться этого:
-
По умолчанию Retrofit корректно обрабатывает нули для всех параметров нулевого запроса, поэтому вы можете сделать что-то вроде:
@GET("/user/{id}/likes")
void getLikes(@Path("id") int id, @Query("n") Integer number, @Query("pos") Integer pos Callback<String> cb);
Если вы используете Object вместо int, вы можете вызвать метод с использованием null для необязательных параметров:
getLikes(1, null, null, cb); // to get /user/1/likes
getLikes(1, 2, null, cb); // to get /user/1/likes?n=2
-
Используя RequestInterceptor:
RestAdapter.Builder builder= new RestAdapter.Builder()
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
if(/*condition*/){
request.addQueryParam(arg0, arg1)
}
}
});
Ответ 2
Теперь доступна поддержка Map<String,String>
. Просто используйте @QueryMap Map<String, String> params
.
Из http://square.github.io/retrofit/:
Для сложных комбинаций параметров запроса можно использовать карту.
Пример:
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);