使用angularjs $ resource删除Restful方法

时间:2015-07-09 10:48:33

标签: angularjs rest angular-resource

我正在尝试通过$ resource调用RESTful方法,如下所示:

资源

angular.module('secure',['ngResource']).factory('Vehicle', function ($resource) {
  return $resource('/secure/vehicle/index', { id: '@id' }, {
    query: {
        method: 'GET',
        isArray: true
    },
    delete: {
        method: 'DELETE',
        isArray: false,
        url: '/secure/vehicle/delete/:id'
    }
  });
});

然后,从其他服务我注入上面的工厂,我用这种方式调用DELETE方法:

 factory.delete = function (procedureId) {
     var vehicle = new Vehicle();
     vehicle.$delete({id: procedureId}, function () {
             //success
             deferred.resolve();
         }, function (errResponse) {
             // fail
             console.log(errResponse);
         });
     return deferred.promise;
 };

不要注意延期的事情,无论是否有效) 不幸的是,我总是得到同样的答案:

 Remote Address:127.0.0.1:8080
 Request URL:http://localhost:8080/secure/vehicle/delete/21
 Request Method:DELETE
 Status Code:422 Unprocessable Entity

呼叫本身已正确设置( secure / vehicle / delete / 21 )。事实上,如果我这样做,但使用 $ http 而不是使用$ resource变量,一切正常!

$http({
    'method': 'DELETE',
    'url': '/secure/vehicle/delete/' + procedureId,
    'headers': {
        'Content-Type': 'application/json'
    },
    'data': ""
})
    .success(function () {
        // success
    })
    .error(function (data, status) {
        console.log(data.errors);
    });

所以,我觉得$ resource-way缺少一些东西,但是什么呢?任何帮助,将不胜感激!

修改

当它读取整个url调用时,它似乎是一个后端问题。如果我使用 $ http 调用DELETE资源,如上所示添加data: "",则后端会正确初始化。 但是如果我尝试 $ resource -way,所需的params是预配置的,并且不喜欢后端,所以我需要找到一种方式来说明$ resource如何添加一些东西像data: "",任何想法?

1 个答案:

答案 0 :(得分:1)

测试证明它有效:

angular.module('secure', ['ngResource']).factory('Vehicle', function($resource) {
  return $resource('/secure/vehicle/index', {
    id: '@id'
  }, {
    query: {
      method: 'GET',
      isArray: true
    },
    delete: {
      method: 'DELETE',
      isArray: false,
      url: '/secure/vehicle/delete/:id'
    }
  });
});

angular.module('secure').factory('VehicleFactory', function(Vehicle, $q) {
  var factory = {}

  factory.delete = function(procedureId) {
    var deferred = $q.defer();
    var vehicle = new Vehicle();
    vehicle.$delete({
      id: procedureId
    }, function(r) {
      deferred.resolve(r);
    }, function(errResponse) {
      console.log(errResponse);
    });
    return deferred.promise;
  };

  return factory;
});

describe('VehicleFactory', function() {

  var $httpBackend, VehicleFactory

  beforeEach(module('secure'));

  beforeEach(inject(function(_$httpBackend_, _VehicleFactory_) {
    $httpBackend = _$httpBackend_
    VehicleFactory = _VehicleFactory_
  }))
  

  it('deletes vehicle - vehicle.$delete()', function() {
    var r = {
      data: 'correct response'
    }
    
    $httpBackend.when('DELETE', '/secure/vehicle/delete/123').respond(r)
    
    VehicleFactory.delete(123).then(function(response) {
      expect(response.data).toBe(r.data)
    })
    
    $httpBackend.flush();
  });
  
  afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation()
    $httpBackend.verifyNoOutstandingRequest()
  })

})
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-resource.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

在没有$ q的情况下编写删除功能的一些更清晰的方法:

angular.module('secure').factory('VehicleFactory', function(Vehicle) {
  var factory = {}

  factory.delete = function(procedureId) {
    return (new Vehicle()).$delete({
      id: procedureId
    })
  }

  return factory;
});