我有一些我想要调用的Web服务。 $resource
或$http
,我应该使用哪一个?
$resource
:https://docs.angularjs.org/api/ngResource/service/$resource
$http
:https://docs.angularjs.org/api/ng/service/$http
在我阅读上述两个API页面后,我迷路了。
请您用简单的英语向我解释有什么不同,我应该在什么情况下使用它们?如何构造这些调用并将结果正确读入js对象?
答案 0 :(得分:209)
我觉得其他答案虽然正确,但并未完全解释问题的根源:REST
是HTTP
的子集。这意味着可以通过REST
完成所有可以通过HTTP
完成的操作,但不能通过HTTP
完成所有操作都可以通过REST
完成。这就是$resource
在内部使用$http
的原因。
那么,什么时候互相使用?
如果你需要的只是REST
,也就是说,你正在尝试访问RESTful
网络服务,$resource
将使得与该网络服务进行交互变得非常容易。
相反,如果您尝试访问不属于RESTful
网络服务的任何内容,则必须使用$http
。请注意,您还可以通过RESTful
访问$http
网络服务,这比使用$resource
要麻烦得多。这是大多数人在AngularJS之外使用jQuery.ajax
(相当于Angular的$http
)的方式。
答案 1 :(得分:166)
$http
用于通用AJAX。在大多数情况下,这就是您正在使用的内容。使用$http
,您将GET
,POST
,DELETE
手动键入调用并处理他们自己返回的对象。
$resource
包装$http
以用于RESTful Web API方案。
非常一般地说:RESTful Web服务将是一个服务,其中一个端点用于数据类型,该数据类型基于HTTP方法(例如GET
,POST
,{{1)对该数据类型执行不同的操作所以使用PUT
,您可以调用DELETE
将资源作为JavaScript对象,然后更改它并将其发送回{{1}或者甚至用$resource
删除它。
......如果这是有道理的。
答案 2 :(得分:41)
$http
进行通用AJAX调用,其中通用表示它可以包含 RESTful api加非RESTful api。
和$resource
专门用于 RESTful 部分。
Restful Api 近年来流行,因为网址更好,而不是程序员编写的随机网址。
如果我使用 RESTful API 来构建网址,那就像/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');
}]);
这将为您提供resource object,其中会自动附带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
。
答案 3 :(得分:30)
我认为答案更多地取决于你在编写代码时你的用户。 如果您是Angular新手,请使用$http
,直到您知道为什么需要$resource
。直到您具体了解$http
如何抓住您返回,您了解在您的代码中使用$resource
的含义,坚持使用$http
。
这是我的经验:我开始了我的第一个Angular项目,我需要向RESTful接口发出HTTP请求,所以我做了你现在正在做的同样的研究。根据我在这样的SO问题中的讨论,我选择了$resource
。 这是一个我希望我可以撤消的错误。这就是原因:
$http
示例丰富,实用,通常只是您需要的内容。清楚的$resource
例子很少,而且(根据我的经验)很少你需要的一切。对于Angular新手,你不会意识到你选择的含义,直到后来,当你对文档感到困惑并且生气,你找不到有用的$resource
例子来帮忙你出去了。$http
可能是您所寻找的一对一心理地图。您不必学习新概念来了解$http
所获得的内容。 $resource
带来了很多细微差别,你还没有心智地图。$http
会返回一个承诺并且.then
能够,因此它适合您正在学习Angular和承诺的新内容。 $resource
,它没有直接返回承诺,使你对Angular基本原理的初步掌握变得复杂。$resource
功能强大,因为它会压缩RESTful CRUD调用的代码以及输入和输出的转换。如果您厌倦了反复编写代码来处理$http
自己的结果,那就太棒了。对于其他任何人来说,$resource
添加了一个神秘的语法和参数传递层,令人困惑。 我希望我在3个月前认识我,并且我会强调告诉自己:"坚持$http
孩子。没关系。"
答案 4 :(得分:23)
我认为重要的是要强调$ resource期望对象或数组作为服务器的响应,而不是原始字符串。因此,如果你有原始字符串(或除了对象和数组之外的任何东西)作为响应,你必须使用$ http
答案 5 :(得分:7)
在$http
或$resource
之间进行选择从技术上讲,没有正确或错误的答案本质上都会做同样的事情。
$resource
的目的是允许您传入模板字符串(包含占位符的字符串)以及参数值。 $resource
会将模板字符串中的占位符替换为作为对象传递的参数值。这在与RESTFul数据源交互时非常有用,因为它们使用类似的原则来定义URL。
$http
做的是执行异步HTTP请求。
答案 6 :(得分:2)
资源服务只是用于处理REST APSI的有用服务。 当你使用它时,你不会编写你的CRUD方法(创建,阅读,更新和删除)
据我所知,资源服务只是一条捷径, 你可以用http服务做任何事情。
答案 7 :(得分:2)
我在使用$ http超过$ http时注意到的一件事是 如果您在.net
中使用Web API$ resource绑定到一个执行单一目的的控制器。
$ 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可以是任何东西。只需指定网址。
$ http.get - " api / authenticate"
[HttpGet]
public bool Authenticate(string email, string password)
{
return _authenticationService.LogIn(email, password, false);
}
这只是我的意见。
答案 8 :(得分:0)
$ resource服务目前不支持promises,因此与$ http服务的接口明显不同。
答案 9 :(得分:0)
我能理解的是,如果您要管理RESTFUL资源,则使用$resource
可以让您在代码中一次定义资源,并将该资源用于对该资源的多次操作。这样可以提高代码的可读性和可维护性。
如果您只想让通用呼叫不像发布,删除,更新那样对其进行管理,则可以使用$http
或$resource
(根据需要)。