Mi api de rest accpets ELIMINAR las solicitudes a la siguiente dirección url

/api/users/{slug}

Por el envío de eliminar a un usuario determinado (slug), el usuario tendría que ser eliminado. aquí está el código de servicio:

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;
}); 

Yo llame a la función de borrado a través de

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

Sin embargo, la petición parece ser enviar a la dirección url incorrecta.

/api/users?id=4

Por lo que el parámetro es realmente falta, como resultado tengo un 405 Método no permitido. ¿Hay alguna posibilidad de enviar la solicitud de eliminación en el estilo de mi api?

4 Comentarios

  1. 28

    params es un objeto de la solicitud predeterminada parameteres en sus acciones. Si desea que los parámetros de la url tiene que especificar en el segundo parámetro como este:

    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;
    }); 

    esto funciona con:

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

    o

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

    o

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

    He hecho un plnkr-ejemplo – tienes que abrir la consola para verificar que las solicitudes de eliminación son correctos.

    Ver parameterDefaults en el Angular de los recursos de la documentación.

    • Creo que este no es el problema, he añadido la función de actualización a mi pregunta, esto funciona muy bien, lo que usted menciona son los valores predeterminados, se consigue anular de todos modos. Sin embargo he probado tu sugerencia y el resultado es el mismo problema.
    • Sí, params en las acciones por defecto parameteres, pero no con el ‘@’ palabra clave’. ¿Tratas de mi sugerencia – porque estoy bastante seguro de que funciona. Si desea asignar {id:123} a id1 en /api/users/:id1 tienes que tener {id1:'@id'} en paramDefaults, no en la acción params
    • Sí, acabo de probar tu solución, no funciona…
    • Si yo uso la actualización de la ruta es: /api/users/4?id=4 y se debe buscar exactamente el mismo para eliminar
    • He actualizado mi respuesta y añadió un trabajo plnkr: plnkr.co/editar/xy366u9Bm9ksXFG33E0L?p=vista previa
    • Aceptar esto funciona ahora, pero mi otro método de la api de «crear» no funciona, el identificador se anexa a la ruta, pero no debería. Cómo arreglar eso?
    • /api/users/3 [POST] en lugar de /api/users [POST]
    • Aquí está lleno de definición de servicio de dpaste.com/1071041
    • OK, he actualizado el plnkr, leer los comentarios y tener una mirada en el registro de la consola – con method:'POST' su user.$update(object_with_params,data_to_send,successFn,errorFn) – no estoy realmente seguro de cómo explicar esto mejor que el docs
    • permítanos continuar esta discusión en el chat

  2. 2

    He tenido este problema durante un tiempo yo estaba usando un servicio para agregar /eliminar /actualizar las categorías. Al pasar de parámetros para obtener funcionó bien, pero luego, cuando la eliminación se me estaba dando una ?id=1234 en lugar de api/recursos/1234

    Tengo alrededor de este, haciendo que el valor predeterminado de parámetro una cadena.

    ///Controlador de

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

    //SERVICIOS

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

    Debe trabajar y la url resultante será, originalmente tenía categoryId en el valor predeterminado de parámetros como el nombre de una variable.

    api/resource/1234 etc
  3. 0

    Solo omite la ‘@’ en el parámetro

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

    esto le dará a usted:

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

    sin el signo de interrogación

    • Creo que usted necesita '@id' en los parámetros a tomar la id de la instancia de recursos.
  4. 0

    Si quieres eliminar un modelo, no hay necesidad de agregar parámetros (parámetros no funciona para ELIMINAR todos modos):

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

    o

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

    No estoy seguro de si es un bug de ngResource.

    • ¿Por qué no los parámetros de trabajo para ELIMINAR?

Dejar respuesta

Please enter your comment!
Please enter your name here