AngularJS $ http和$资源

我刚接触AngularJS,所以请原谅我的无知。

我有一些我想调用的Web服务。 $resource$http ,我应该使用哪一个?

$resource : https : //docs.angularjs.org/api/ngResource/service/$resource

$http : https : //docs.angularjs.org/api/ng/service/$http

在阅读了上述两个API页面之后,我迷失了方向。

你能否用简单的英文向我解释有什么区别,我应该在什么情况下使用它们? 我如何构造这些调用并正确地将结果读入js对象?

$http是一般用途的AJAX。 在大多数情况下,这是你将要使用的。 使用$http您将手动进行GETPOSTDELETEtypes的调用,并处理它们自己返回的对象。

$resource包装了$http ,用于RESTful web API场景。


一般来说:一个REST风格的Web服务将是一个端点的数据types的服务,它根据像GETPOSTPUTDELETE等HTTP方法与这个数据types做不同的事情。所以用$resource ,你可以调用一个GET来获取资源作为一个JavaScript对象,然后改变它并用POST发送它,甚至用DELETE删除它。

…如果这是有道理的。

我觉得其他答案虽然正确,但并不能完全解释问题的根源: RESTHTTP一个子集。 这意味着所有可以通过REST完成的事情都可以通过HTTP完成,但并不是所有可以通过HTTP完成的事情都可以通过REST完成。 这就是$resource内部使用$http原因。

那么,什么时候用对方?

如果你所需要的只是REST ,也就是说,你正试图访问一个RESTful web服务,那么$resource将会使它与这个web服务交互变得非常容易。

相反,如果您尝试访问任何不是RESTful Web服务,那么您将不得不使用$http 。 请记住,你也可以通过$http访问一个RESTful webservice,它比$resource要麻烦得多。 这是大多数人通过使用jQuery.ajax (相当于Angular的$http )在AngularJS之外进行的方式。

$http进行通用的AJAX调用,其中通常意味着它可以包括REST风格的 API和非REST风格的 API。

$resource专门用于该RESTful部分。

Restful Api最近几年stream行起来,因为url更好地组织起来,而不是由程序员组成的随机url。

如果我使用RESTful API来构buildurl,那么将会是/api/cars/:carId

$resource方式来获取数据

 angular.module('myApp', ['ngResource']) // Service .factory('FooService', ['$resource', function($resource) { return $resource('/api/cars/:carId') }]); // Controller .controller('MainController', ['FooService', function(FooService){ var self = this; self.cars = FooService.query(); self.myCar = FooService.get('123'); }]); 

这会给你一个资源对象 ,这是伴随着getsavequeryremove ,自动delete方法。

$http方式获取数据

 angular.module('myApp', []) // Service .factory('FooService', ['$http', function($http){ return { query: function(){ return $http.get('/api/cars'); }, get: function(){ return $http.get('/api/cars/123'); } // etc... } 

看看我们需要如何在RESTFul API上定义每个常见的操作。 另一个区别是$http返回promise$resource返回一个对象。 还有第三方插件帮助Angular处理RESTFul API,如restangular


如果API是/api/getcarsinfo 。 所有留给我们的是使用$http

我想这个答案更多地取决于你在编写代码的时候是谁。 如果您是Angular的新手,请使用$http ,直到您知道为什么需要$resource 直到你有$http阻止你的具体经验,并且你明白在你的代码中使用$resource的含义,坚持使用$http

这是我的经验:我开始了我的第一个Angular项目,我需要向一个RESTful接口发出HTTP请求,所以我做了和现在一样的研究。 根据我在这个问题上的讨论,我select了$resource我希望我能撤消这个错误。 原因如下:

  1. $http例子是丰富的,有帮助的,一般只是你所需要的。 清楚的$resource例子是稀缺的,(以我的经验)很less你需要的一切。 对于Angular的新手来说,直到后来你才会意识到自己select的含义,当你困惑于文档,并且生气地发现你找不到有用的$resource例子来帮助你。
  2. $http可能是您要查找的1对1心智图。 你不必学习一个新的概念来理解你用$http得到什么。 $resource带来了很多细微差别,你还没有一个心理地图。
  3. 哎呀,我说你不必学习一个新的概念? 作为一个angular度的新手,你必须学习有关承诺。 $http返回一个承诺,然后才能够,所以它正好适合你正在学习的有关Angular和promise的新东西。 $resource ,不直接返回一个承诺,复杂化你对Angular基础的初步把握。
  4. $resource是强大的,因为它压缩了RESTful CRUD调用的代码以及input和输出的转换。 如果您厌倦了重复编写代码来自己处理$http的结果,那就太好了。 对其他人而言, $resource增加了一层令人困惑的语法和parameter passing的神秘层。

我希望我在3个月前认识我,而且我会强调自己:“坚持$http孩子,这很好。”

我认为重要的是强调$资源需要对象或数组作为服务器的响应,而不是原始string。 所以,如果你有原始string(或除了对象和数组之外的任何东西)作为响应,你必须使用$ http

当从$http$resource之间进行select的时候,从技术上来讲,实质上没有正确或者错误的答案,两者都会这样做。

$resource的目的是允许你传递一个模板string(一个包含占位符的string)和参数值。 $resource将使用作为对象传递的参数值来replace模板string中的占位符 。 当与RESTFul数据源交互时,这是非常有用的,因为它们使用类似的原则来定义URL。

$http做的是执行asynchronousHTTP请求。

资源服务对于使用REST APSI是非常有用的服务。 当你使用它,你不写你的CRUD方法(创build,读取,更新和删除)

据我所知,资源服务只是一个捷径,你可以用http服务做任何事情。

有一件事我注意到当使用$资源$ http时,如果你在.net中使用Web API

$资源绑定到一个控制器执行一个单一的目的。

$ resource('/ user /:userId',{userId:'@ id'});

 [HttpGet] public bool Get(int id) { return "value" } public void Post([FromBody]string value) { } public void Put(int id, [FromBody]string value) { } public void Delete(int id) { } 

虽然$ http可能是任何东西。 只需指定url。

$ http.get – “api / authenticate”

 [HttpGet] public bool Authenticate(string email, string password) { return _authenticationService.LogIn(email, password, false); } 

这只是我的意见。

$资源服务目前不支持承诺,因此与$ http服务有明显不同的接口。