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
您将手动进行GET
, POST
, DELETE
types的调用,并处理它们自己返回的对象。
$resource
包装了$http
,用于RESTful web API场景。
一般来说:一个REST风格的Web服务将是一个端点的数据types的服务,它根据像GET
, POST
, PUT
, DELETE
等HTTP方法与这个数据types做不同的事情。所以用$resource
,你可以调用一个GET
来获取资源作为一个JavaScript对象,然后改变它并用POST
发送它,甚至用DELETE
删除它。
…如果这是有道理的。
我觉得其他答案虽然正确,但并不能完全解释问题的根源: REST
是HTTP
一个子集。 这意味着所有可以通过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'); }]);
这会给你一个资源对象 ,这是伴随着get
, save
, query
, remove
,自动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
。 我希望我能撤消这个错误。 原因如下:
-
$http
例子是丰富的,有帮助的,一般只是你所需要的。 清楚的$resource
例子是稀缺的,(以我的经验)很less你需要的一切。 对于Angular的新手来说,直到后来你才会意识到自己select的含义,当你困惑于文档,并且生气地发现你找不到有用的$resource
例子来帮助你。 -
$http
可能是您要查找的1对1心智图。 你不必学习一个新的概念来理解你用$http
得到什么。$resource
带来了很多细微差别,你还没有一个心理地图。 - 哎呀,我说你不必学习一个新的概念? 作为一个angular度的新手,你必须学习有关承诺。
$http
返回一个承诺,然后才能够,所以它正好适合你正在学习的有关Angular和promise的新东西。$resource
,不直接返回一个承诺,复杂化你对Angular基础的初步把握。 -
$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服务有明显不同的接口。