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

Строка запроса в $resource url

моя служба должна использовать строку запроса из-за ограничений на сервере, который запускает классический ASP:

angular
  .module('myServices', ['ng', 'ngResource'])
  .factory('Item', ['$resource',
     function ($resource) {
         return $resource('/api/?p=item/:id');
     }]);

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

Item.query({test: 123}, on_success, on_error);

но полученный URL-адрес

/api/?p=item?test=123

По-видимому, есть ошибка, но как обойти ее?

EDIT: зарегистрировано в https://github.com/angular/angular.js/issues/1511

4b9b3361

Ответ 1

Вы можете использовать параметры ресурсов. Если вы не указали заполнители в пути, они автоматически преобразуются в параметры строки запроса. Например:

angular
    .module('myServices', ['ng', 'ngResource'])
    .factory('Item', [
         '$resource',
         function ($resource) {
             return $resource('/api');
     }]);

Item.query({p: 'item/1'});

Это приведет к запросу /api?p=item/1.

P.S.

Я полагаю, вы уже знаете это, но вам это не нравится. Но я все еще думаю, что это правильный путь в вашем случае. Учитывая плохой дизайн API, вы имеете дело с этим контентом, вы можете обернуть ресурсы AngularJS другой службой, которая сделает это за вас.

Ответ 2

var deferred = $q.defer();
api.api_name.query({
    'param':param_value
},
    function(response) {
        deferred.resolve(response);
    },
    function(response) {
        deferred.reject(response);
    }
);
//
angular
    .module('module_name')
    .factory('api',function($resource){
        var api_var={};
        api_var.api_name = $resource('url?param_key=:param', {
            param: '@param'
        }, {
            'query': {
                method: 'get'
            }
        });
        return api_var;
    });