Подтвердить что ты не робот

Динамически добавлять необязательные параметры в запросы 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 или что-то иметь возможность динамически добавлять необязательные параметры в мои запросы?

4b9b3361

Ответ 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);