DELETE宁静法angularjs $资源 [英] DELETE Restful method with angularjs $resource

查看:192
本文介绍了DELETE宁静法angularjs $资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我attemping调用通过$资源REST风格的方法如下:

资源

  angular.module('安全',['ngResource'])。工厂('车',函数($资源){
  返回$资源('/安全/车/索引,{ID:'@id'},{
    查询:{
        方法:GET,
        IsArray的:真
    },
    删除:{
        方法:删除,
        IsArray的:假的,
        网址:'/安全/车/删除/:身份证'
    }
  });
});

然后,从其他服务我注入上述工厂,我把这样DELETE方法:

  factory.delete =功能(procedureId){
     VAR车辆=新车();
     。车辆$删除({ID:procedureId},函数(){
             //成功
             deferred.resolve();
         },功能(errResponse){
             //失败
             的console.log(errResponse);
         });
     返回deferred.promise;
 };

注意不要递延的东西,它不会有或没有它的工作)
不幸的是,我总是得到相同的答案:

 远程地址:127.0.0.1:8080
 请求URL:http://本地主机:8080 /安全/车/删除/ 21
 请求方法:DELETE
 状态code:422无法处理的实体

调用本身设置正确(安全/车/删除/ 21 的)。事实上,如果我这样做,但不是使用$资源变量,使用的 $ HTTP 后,一切正常!

  $ HTTP({
    方法:删除,
    URL:'/安全/车/删除/+ procedureId,
    头:{
        内容类型:应用/ JSON
    },
    数据:
})
    .success(函数(){
        //成功
    })
    .error(功能(数据,状态){
        的console.log(data.errors);
    });

所以,我想缺少的东西在$资源的方式,但什么?任何帮助,这将是AP preciated!

编辑:

这似乎是一个后端的问题时,它读取整个URL电话。如果我叫DELETE资源,使用的 $ HTTP ,加入数据:因为我在上面,后端可以正确初始化本身。
但如果我尝试在 $资源 -way,所需的PARAMS是pre-配置,并且不喜欢到后端,所以我需要找到要说到$资源怎样的方式增加类似数据:?,任何想法


解决方案

测试证明,它的作品:

\r
\r

angular.module('安全',['ngResource'])。厂( 车辆,函数($资源){\r
  返回$资源('/安全/车/指数',{\r
    ID:@Id\r
  },{\r
    查询:{\r
      方法:GET,\r
      IsArray的:真\r
    },\r
    删除:{\r
      方法:删除,\r
      IsArray的:假的,\r
      网址:'/安全/车/删除/:身份证'\r
    }\r
  });\r
});\r
\r
angular.module(安全)。工厂('VehicleFactory',函数(车辆,$ Q){\r
  变种工厂= {}\r
\r
  factory.delete =功能(procedureId){\r
    变种推迟= $ q.defer();\r
    VAR车辆=新车();\r
    车辆。$删除({\r
      ID:procedureId\r
    },功能(R){\r
      deferred.resolve(R);\r
    },功能(errResponse){\r
      的console.log(errResponse);\r
    });\r
    返回deferred.promise;\r
  };\r
\r
  回厂;\r
});\r
\r
描述(VehicleFactory',函数(){\r
\r
  变量$ httpBackend,VehicleFactory\r
\r
  beforeEach(模块('安全'));\r
\r
  beforeEach(注(功能(_ $ httpBackend_,_VehicleFactory_){\r
    $ httpBackend = _ $ httpBackend_\r
    VehicleFactory = _VehicleFactory_\r
  }))\r
  \r
\r
  它('删除车辆 - 车辆$删除()',函数(){\r
    变种R = {\r
      数据:正确反应\r
    }\r
    \r
    $ httpBackend.when('删除','/secure/vehicle/delete/123').respond(r)\r
    \r
    VehicleFactory.delete(123)。然后(功能(响应){\r
      期待(response.data).toBe(r.data)\r
    })\r
    \r
    $ httpBackend.flush();\r
  });\r
  \r
  afterEach(函数(){\r
    $ httpBackend.verifyNoOutstandingExpectation()\r
    $ httpBackend.verifyNoOutstandingRequest()\r
  })\r
\r
})

\r

<链接HREF =// safjanowski.github.io/jasmine-jsfiddle -pack /包/ jasmine.css的rel =stylesheet属性/>\r
&LT;脚本src=\"//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js\"></script>\r
&LT;脚本的src =// ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js\"></script>\r
&LT;脚本的src =// ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-resource.min.js\"></script>\r
&LT;脚本src=\"//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js\"></script>\r
\r
\r

有些更清洁的方式来写,而不$ Q删除功能:

  angular.module(安全)。工厂('VehicleFactory',函数(车辆){
  变种工厂= {}  factory.delete =功能(procedureId){
    回报率(新车())。$删除({
      ID:procedureId
    })
  }  回厂;
});

I'm attemping to call a RESTful method via $resource as following:

Resource:

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

Then, from other service I inject the above factory and I call DELETE method in this way:

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

(Don't pay attention to deferred things, it doesn't work with or without it) Unfortunately, I always get the same answer:

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

The call itself is set up properly (secure/vehicle/delete/21). In fact, if I do the same, but instead of using $resource variable, using $http, everything works!

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

So, I guess something is missing in $resource-way, but what? Any help, it will be appreciated!

EDIT:

It seems it's a backend problem when it reads the entire url call. If I call DELETE resource, using $http, adding the data: "" as I show above, the backend initializes itself properly. But if I try the $resource-way, the required params are pre-configured and that doesn't like to the backend, so I need to find the way to say to $resource how to add something like data: "", any ideas?

解决方案

Test proof that it works:

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>

Some much cleaner way to write delete functionality without $q:

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

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

  return factory;
});

这篇关于DELETE宁静法angularjs $资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆