Можно ли выполнить Restangular GET с несколькими параметрами запроса?

Я пытался выполнить Restangular GET с несколькими параметрами запроса (для простой разбивки на страницы), и это кажется невозможным - по крайней мере, с тем, что я пытаюсь сделать. Вот что я пытаюсь сделать:

Restangular.all('elevation').get({ pageParam: page, pageSizeParam: pageSize }).then(function(data) {
    console.log(data);
});

С ожидаемым ответом, выглядящим примерно так:

{ totalRecords: 233, elevations: {...} }

Это не работает и приводит к следующему:

GET http://localhost:24287/elevation/[object%20Object] 404 (не Найденный)

Я также пытаюсь использовать customGET, что приводит к той же проблеме, что и выше.

Единственный способ передать несколько параметров запроса — использовать getList. К сожалению, при использовании getList неудивительно, что возникает следующая ошибка:

Ошибка: ответ для getList ДОЛЖЕН быть массивом, а не объектом или чем-то еще

Чтобы решить эту проблему, в документации Restangular указано Мой ответ на самом деле содержит некоторые метаданные. Как мне получить данные в этом случае? раздел, который мне нужен для использования addResponseInterceptor, который я сделал следующим образом:

 RestangularProvider.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
  var newResponse = [];
  if(response.data.totalRecords !== undefined) {
    newResponse.elevationData= {};
    newResponse.elevationData.totalRecords = response.data.totalRecords;
    newResponse.elevationData.elevations = response.data.elevations;
  }
  return newResponse;
});

После прыжков через обручи это запутанное решение действительно работает. Нет ли более простого способа просто вызвать Restangular get с несколькими параметрами запроса и получить возвращаемый объект?

На данный момент было бы намного проще отказаться от Restangular и просто использовать сервис $http следующим образом:

$http.get('http://localhost:24287/elevation?page=' + page + '&pageSize=' + pageSize).then(function(result) {
    console.log(result.data.totalRecords);
    console.log(result.data.elevations);
});

Хотя я действительно хочу найти лучший способ сделать это с Restangular.

Благодарим за любую идею! Спасибо!


person cjones26    schedule 29.04.2015    source источник
comment
Помогает ли это ng-newsletter.com/posts/restangular.html @ кнопка страницы.   -  person eugenekgn    schedule 29.04.2015
comment
Спасибо за ссылку, хотя похоже, что это в основном то же самое, что и документация с лучшими примерами :).   -  person cjones26    schedule 29.04.2015
comment
извини, приятель, я пытался... Я перестал использовать restangular и начал использовать родные средства angular, потому что они кажутся лучше документированными.   -  person eugenekgn    schedule 29.04.2015
comment
Согласен - я и сам скоро пойду в этом направлении. Просто кажется, что работать стало легче.   -  person cjones26    schedule 29.04.2015


Ответы (1)


Это чертовски просто: запрашивать URL-адрес ресурса без идентификатора, даже с определенными параметрами запроса, и возвращать один объект — это просто не RESTful.

Ошибка: ответ для getList ДОЛЖЕН быть массивом, а не объектом или чем-то еще

Это точно говорит вам правду: ваш запрос может вернуть массив, потому что вы не указали уникальный идентификатор (все остальное не уникально).

На данный момент было бы намного проще отказаться от Restangular и просто использовать сервис $http

Определенно, поскольку Restangular фокусируется на проксировании ресурсов RESTful, или вам придется его настроить (перехватчики, customGET,...)

person Cyril CHAPON    schedule 29.04.2015
comment
Сирил - я не возвращаю только один объект, я получаю список, он просто обернут в метаданные (в этом случае общее количество записей является родственным самому списку). Я не запрашиваю уникальный идентификатор, потому что я ищу этот список всех объектов — ну, в данном случае, подмножество всех их — страницу. Я хочу сказать, что должен быть более простой способ передать несколько параметров запроса любому из методов GET, которые предоставляет Restangular. - person cjones26; 30.04.2015
comment
Слэшп. И вся моя мысль в том, что я не думаю, что вы можете, потому что Restangular фокусируется на RESTful API. Вы следовали точно правильному пути, и Restangular настолько хорошо спроектирован, что провел вас через процесс: 1) вы сначала пытались использовать get, зная, что ваш API возвращает один объект json, и он не позволяет вам добавлять некоторые параметры , потому что он предназначен для возврата одного объекта по идентификатору и не требует никакого запроса. 2) вы пытались запросить getList, он сказал вам, что ваш API должен возвращать список, или ответ необходимо настроить с помощью перехватчика. - person Cyril CHAPON; 09.05.2015
comment
Не все так просто, надо сказать, на самом деле. Но нет другого решения, если вы хотите использовать Restangular. Возможно, вы правы, думая, что не должны, поскольку это не соответствует вашей цели. См. RESTful. - person Cyril CHAPON; 09.05.2015