我有一些要调用的Web服务。 $resource或$http,我应该使用哪一个?
$resource: https //docs.angularjs.org/api/ngResource/service/$resource
$http: https //docs.angularjs.org/api/ng/service/$http
阅读以上两个API页面后,我迷路了。
您能用简单的英语给我解释一下有什么区别,在什么情况下我应该使用它们?如何构造这些调用并将结果正确读入js对象?
我有一些要调用的Web服务。 $resource或$http,我应该使用哪一个?
$resource: https //docs.angularjs.org/api/ngResource/service/$resource
$http: https //docs.angularjs.org/api/ng/service/$http
阅读以上两个API页面后,我迷路了。
您能用简单的英语给我解释一下有什么区别,在什么情况下我应该使用它们?如何构造这些调用并将结果正确读入js对象?
Answers:
$http用于通用AJAX。在大多数情况下,这就是您要使用的内容。随着$http你将要作出GET,POST,DELETE型手动调用和处理他们回到你自己的对象。
$resource包装$http以用于RESTful Web API场景。
概而言之:RESTful Web服务将与一个端点为基于HTTP的方法,如与数据类型进行不同的处理数据的服务类型GET,POST,PUT,DELETE,等于是用一个$resource,你可以调用一个GET获取资源作为JavaScript对象,然后对其进行更改并使用,然后将其发送回POST,甚至使用删除它DELETE。
...如果有道理。
$resource的服务只会惯用/好,如果你的REST终端支持GET,POST,和 DELETE?文档(docs.angularjs.org/api/ngResource.$resource)显示,您可以通过使用这3种REST方法$resource。
PUT或其他任何你想,GET,POST和DELETE只是默认值。如果您的终结点使用多个HTTP方法来处理同一资源(这很重要),那么这$resource是一个不错的选择。
.$promise可以很好地resolve进行路由和绑定。
我认为其他答案虽然正确,但并不能完全解释问题的根源:REST是的子集HTTP。这意味着可以通过完成的所有操作REST都可以通过完成,HTTP但是不能通过完成的所有操作HTTP都可以通过完成REST。这就是为什么在内部$resource使用$http。
那么,何时互相使用?
如果您只需要REST,也就是说,您正在尝试访问RESTfulWeb服务,$resource则将使其与该Web服务进行交互变得非常容易。
相反,如果您尝试访问不是RESTfulWeb 服务的任何内容,则必须使用$http。请记住,您还可以RESTful通过来访问Web服务$http,这将比使用麻烦得多$resource。这是大多数人通过使用jQuery.ajax(等效于Angular的$http)在AngularJS之外进行操作的方式。
$http进行通用AJAX调用,这意味着通用可以包括RESTful api和Non-RESTful api。
并且$resource专门针对该RESTful部分。
近年来,Restful Api盛行是因为URL的组织性更好,而不是由程序员编写的随机URL。
如果我使用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');
}]);
这会给你的资源对象,它是伴随着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。
/api/getcarsinfo我想使用api,我们仍然可以使用$resource
我想答案更多地取决于谁,你是在你写代码的时间。如果您不熟悉Angular,请使用$http,直到您知道为什么需要$resource。除非您对如何$http阻碍自己有具体的经验,并且了解$resource在代码中使用的含义,否则请坚持使用$http。
这就是我的经验:我开始了我的第一个Angular项目,我需要向RESTful接口发出HTTP请求,因此我做了与现在相同的研究。根据我在此类问题中阅读的讨论,我选择继续$resource。我希望我可以撤销这个错误。原因如下:
$http示例很多,很有帮助,并且通常只是您需要的。$resource缺少清晰的示例,而且(以我的经验)几乎不需要您所需的一切。对于Angular新手,直到后来陷入困惑的文档并为找不到$resource帮助您的有用示例而感到恼火之时,您才意识到选择的含义。$http可能是您要寻找的一对一思维导图。您无需学习新概念即可了解所获得的东西$http。$resource带来了很多细微差别,您还没有心智图。$http返回一个诺言并.then能够实现,因此它正适合您正在学习的有关Angular和诺言的新知识。$resource不会直接返回承诺,这会使您对Angular基础知识的初步了解变得复杂。$resource之所以功能强大,是因为它压缩了RESTful CRUD调用的代码以及输入和输出的转换。如果您厌倦了反复编写代码来处理结果的话,那就太好了$http自己那就。对于其他任何人,$resource添加一个令人困惑的语法和参数传递的神秘层。我希望我三个月前认识我,然后我会很强力地对自己说:“和$http孩子们呆在一起。很好。”
/user/:userId或)时确实会有所帮助/thing。移至该位置/users/roles/:roleId后,您必须根据每个动词修改$ resource url和params ,此时最好使用$ http。
$resource并切换到$http某些地方。我不能强调我从未见过的希望$resource。我可能已经浪费了一个多星期来追逐$resource过去几个月的细微差别。$http如此简单明了,$resource学习曲线彻底抹去了任何收获。
我认为重要的是要强调$ resource期望对象或数组是服务器的响应,而不是原始字符串。因此,如果您有原始字符串(或对象和数组以外的任何字符串)作为响应,则必须使用$ http
在选择$http或$resource技术上来讲,实质上没有对或错的答案,两者都会做同样的事情。
的目的$resource是允许您传递模板字符串(包含占位符的字符串)以及参数值。$resource将替换占位符模板字符串中为作为对象传递的参数值。与RESTFul数据源进行交互时,这非常有用,因为它们使用类似的原理来定义URL。
什么$http是执行异步HTTP请求。
$resource不能异步执行?只是想澄清
$http是执行异步HTTP请求的最简单方法,并且$resource本质上是相同的,但具有不同的参数
资源服务只是使用REST APSI的有用服务。使用它时,您无需编写CRUD方法(创建,读取,更新和删除)
据我所知,资源服务只是一个捷径,您可以使用http服务执行任何操作。
$http.get('/path/to/thing', params),myResource.get(params)加上加实际为进行配置myResource。前面有更多代码,只有在使用相同 API名词的情况下才能真正发挥作用。否则,您的编码与使用$ http一样。
在$ http上使用$ resource时,我注意到的一件事是,如果您在.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);
}
这只是我的意见。
$ resource服务当前不支持诺言,因此与$ http服务具有明显不同的接口。
var myResource = $resource(...config...);在服务中的其他地方一样做到这一点,return myResource.get(..params...)或者可以做到var save = myResource.save(); save.$promise.then(...fn...); return save;