Динамически добавлять необязательные параметры в запросы API

У меня есть Android-приложение, которое общается с REST API.

Для каждого запроса я хочу, чтобы мое приложение могло добавлять необязательные параметры в дополнение к обязательным параметрам.

Как я могу реализовать это с помощью 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 или что-то, что можно динамически добавлять к моим запросам дополнительные параметры?

У вас есть несколько способов добиться этого:

  • По умолчанию 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) } } }); 

Поддержка 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);