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

Angular.js удалить ресурс с параметром

My rest api accpets DELETE запрашивает следующий URL

/api/users/{slug}

Таким образом, отправляя удаление указанному пользователю (slug), пользователь будет удален. вот код службы:

angular.module('UserService',['ngResource']).factory('User', function($resource){
    var User = $resource('/api/users/:id1/:action/:id2', //add param to the url
    {}, 
    { 
        delete_user: {
            method: 'DELETE',
            params: {
                id1:"@id"
            }
        },
        update: {
            method: 'PUT',
            params: {
                id1:"@id"
            }
        }
    }); 

    return User;
}); 

Я вызываю функцию delete через

user.$delete_user({id:user.id}, function(){}, function(response){}); 

Однако запрос, кажется, посылает неправильный URL-адрес.

/api/users?id=4

Таким образом, параметр фактически отсутствует, в результате я получаю метод 405 не допускается. Есть ли возможность отправить запрос удаления в стиле моего api?

4b9b3361

Ответ 1

params является объектом параметров запроса по умолчанию в ваших действиях. Если вам нужны параметры url, вы должны указать их во втором параметре, например:

angular.module('UserService',['ngResource']).factory('User', function($resource){
    var User = $resource('/api/users/:id1/:action/:id2', //add param to the url
    {id1:'@id'},
    { 
        delete_user: {
            method: 'DELETE'
        }
    }); 

    return User;
}); 

это работает либо с:

// user has id
user.$delete_user(function(){
  //success
},function(){
  // error
});

или

var data = {id:'id_from_data'};
User.delete_user({},data);

или

var params = {id1:'id1_from_params'};
User.delete_user(params);

Я сделал пример plnkr. Вам нужно открыть консоль, чтобы убедиться, что запросы DELETE верны.

См. параметрDefaults в документации Angular.

Ответ 2

У меня была эта проблема некоторое время, когда я использовал службу для добавления/удаления/обновления категорий. При прохождении в параметрах для получения он работал нормально, но тогда при удалении это давало мне? Id = 1234 вместо api/resource/1234

Я обошел это, установив по умолчанию параметр string.

///контроллер

Service.delete({categoryId:id}, function(resp){
  console.log(resp)//whatever logic you want in here 
});

//УСЛУГИ

$resource('api/resource/:categoryId', {"categoryId":"@categoryId"}, {
   query:{method:"GET"},
   delete:{method:"DELETE"},

});

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

api/resource/1234 etc

Ответ 3

Просто опустите параметр "@" в параметре

   .factory('reportFactory', ['$resource', 'baseUrl', function ($resource, baseUrl) {
        return $resource(baseUrl + '/keys/:id', {}, {
        delete: { method: 'DELETE',
            headers: {
                'Content-Type': 'application/json'
            },
            params: {id: 'id'} }
       })
}]);

это даст вам:

  http://localhost:8080/reports/api/keys/b8a8a8e39a8f55da94fdbe6c 

без вопросительного знака

Ответ 4

Если вы хотите удалить модель, нет необходимости добавлять params (params не работает для DELETE в любом случае):

$resource('/users/:id').delete({id: user.id}, function(res) {
  ...
})

или

$resource('/users/:role/:id').delete({role: 'visitor', id: user.id});

Я не уверен, что это ошибка ngResource.