2012-11-01 62 views
245

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

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

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

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

后,我看了上面的两个API的页面,我失去了。

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

+25

$资源建立在$ http之上,并且提供了对底层通信的进一步抽象。它还需要一个符合$资源模式的REST终点。既然你问,我的建议是从$ http开始,熟悉,然后再看看你是否可以转向$资源。 –

+4

感谢您的回答。那么,在什么情况下,$ http除了我可以熟悉api之外,更喜欢超过$资源? – Tom

回答

159

$http是用于通用AJAX。在大多数情况下,这是你将要使用的。使用$http您将手动创建GET,POST,DELETE类型的调用并处理它们自己返回的对象。

$resource换行$http用于REST风格的Web API场景。


概而言之:RESTful Web服务将与一个端点为基于HTTP的方法,如GETPOSTPUTDELETE等与数据类型做不同的事情一个数据类型的服务,使如果使用$resource,则可以调用GET将资源作为JavaScript对象进行获取,然后对其进行修改并将其发送回POST,甚至用DELETE将其删除。

......如果这是有道理的。

+0

所以$资源处理Restful服务,这意味着它也可以用来调用普通的Web服务?因为它做GET POST DELETE PUT所有。那么,在什么情况下$ http优先于$资源呢? – Tom

+7

真的任何时候你没有处理一个真正平静的端点。例如,如果您的端点只允许GET,它会添加许多您不需要的功能。 –

+0

@blesh,如果你的REST端点支持'GET','POST',*和*'DELETE',那么使用'$ resource'服务只会是惯用的/好的吗? docs(http://docs.angularjs.org/api/ngResource.$resource)显示你用'$ resource'得到这3个REST方法。 –

7

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

$resource的目的是为了让您传递模板字符串(包含占位符的字符串)以及参数值。 $resource将使用作为对象传递的参数值替换模板字符串中的占位符。当与RESTFul数据源进行交互时,这是非常有用的,因为它们使用类似的原则来定义URL。

$http所做的是执行异步HTTP请求。

+1

这是一个很好的答案,因为它指出$ http是为$ resource的请求提供动力,并且要么执行基本相同的操作。 – coblr

+0

@Dororzo所以你的意思是说'$资源'不能异步执行?只是想澄清 – Satyadev

+0

不,我指出的最后'$ http'是执行异步HTTP请求的最简单的方法,而'$ resource'本质上是相同的,但具有不同的参数 – Dalorzo

200

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

那么,什么时候用对方?

如果你需要的是REST,也就是你试图访问一个Web服务RESTful$resource将会使超级容易到与该Web服务交互。

如果您试图访问任何不是RESTful webservice的东西,那么您将不得不使用$http。请记住,您还可以通过$http访问RESTful网络服务,这将比$resource复杂得多。这是大多数人通过使用jQuery.ajax(相当于Angular的$http)在AngularJS之外进行的方式。

+21

很好的答案,这应该被接受,而不是顶级的 – Hoto

+2

这意味着我们有三种方法可以调用RESTful? 使用$资源,$ http和jquery.ajax,我是吗? –

+4

@JakeHuang即使没有任何图书馆,你也可以称它为无限的方法。我刚刚公开了AngularJS世界中最流行的两种方法以及最常见的方法。 – bluehallu

22

我认为值得强调的是$ resource需要对象或数组作为服务器响应,而不是原始字符串。因此,如果您有原始字符串(或除对象和数组以外的任何东西)作为响应,则必须使用$ http

+0

这是否意味着$ http不支持对象和数组?只是想澄清。 – Shardul

+0

我相信$ http支持对象,数组和字符串 - 我需要确认,虽然 – Katana24

+0

@Shardul,我明白$ http处理任何类型的响应,但$资源只处理对象和数组。 –

2

资源服务对于使用REST APSI来说只是有用的服务。 当你使用它,你不写你的增删改查方法(创建,读取,更新和删除)

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

+0

我不确定我会将$资源分类为快捷方式。它是$ http的包装,因此直接使用$ http将会“更短”。这是一种配置$ http的方式,以便在使用$ http时可能会有更少的代码。在一个例子中''http.get('/ path/to/thing',params)'''myResource.get(params)'加上实际为'myResource'进行配置。预先提供更多代码,并且只能与_相同的API名词游泳。否则,你的编码就像使用$ http一样。 – coblr

2

有一件事我使用了$ HTTP是 如果您正在使用的Web API在.NET

$资源被捆绑成执行一个单一的目的一个控制器$资源时发现。

$ 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 /认证”

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

这只是我的意见。

38

$http使得通用AJAX调用,其中一般意味着它可以包括的RESTful API非RESTful API

$resource是专门为那个RESTful部分。

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

如果我使用REST风格的API来构建url,它将会像/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,这是自动伴有getsavequeryremovedelete方法。

$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... 
     } 

看看我们如何需要定义REST风格的API每个常见的操作。另一个区别是$http返回promise,而$resource返回一个对象。也有第三方插件,帮助角处理REST风格的APIrestangular


如果API是一样的东西/api/getcarsinfo。所有离开我们是使用$http

+4

这应该是答案。 –

+1

如果api是'/ api/getcarsinfo'我想我们仍然可以使用'$ resource' – Satyadev

+0

真棒....... –

0

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

+1

$资源服务确实支持承诺,但它不直接像$ http那样返回$ promise。你必须像'var myResource = $ resource(... config ...)那样去做;'然后在服务的其他地方'返回myResource.get(.. params ...)'或者你可以' var save = myResource.save();节省$ promise.then(... FN ...)。返回保存;' – coblr

25

我认为答案更多地取决于您在编写代码时候您的如果您是Angular的新手,请使用$http,直到您知道为什么需要$resource直到您具体了解$http如何阻止您,并且您了解在中使用$resource的含义,请使用$http

这是我的经验:我开始了我的第一个Angular项目,我需要向一个RESTful接口发出HTTP请求,所以我做了和现在一样的研究。根据我在这样的SO问题中阅读的讨论,我选择了$resource这是一个我希望我能解开的错误。这里的原因:

  1. $http例子是丰富的,有益的,通常你需要的东西。清除$resource例子很少,并且(以我的经验)很少有你需要的。对于Angular的新手来说,直到后来你才会意识到自己选择的含义,当你困惑于文档时感到困惑,并且愤怒地发现你找不到有用的例子来帮助你。
  2. $http可能是您要查找的1对1心智图。您无需学习新概念即可了解您使用$http获得的结果。 $resource带来了很多细微差别,你还没有一个心智地图。
  3. 哎呀,我说你不必学习一个新概念?作为一个角度的新手,你必须了解承诺。 $http返回一个承诺,并且是.then的能力,因此它适合您正在学习的有关Angular和承诺的新事物。 $resource,它不直接返回承诺,使您对Angular基础知识的初步掌握复杂化。
  4. $resource功能强大,因为它可以浓缩RESTful CRUD调用的代码和输入和输出的转换。如果您厌倦了重复编写代码来自己处理$http的结果,那就太好了。对其他人而言,$resource增加了令人困惑的语法和参数传递的神秘层。

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

+1

我喜欢你的答案,特别是最后一行。我目前正在使用$ resource vs $ http进行转换。我还要补充的一点是,$ resource实际上只有非常方便,并且在使用相同的API _noun_时,例如'/ user /:userId'或'/ thing',实际上会有所帮助。一旦你移动到'/ users/roles /:roleId',那么你必须修改$ resource url和params,并且你可能会在这个时候使用$ http。 – coblr

+3

打电话给我的精神分裂症评论我自己的答案,但我想我会提及更近的经验。我一直在重构以消除'$ resource'并在地方切换到'$ http'。我无法强调我希望希望的多少*我从未见过'$ resource'。在过去的几个月里,我可能浪费了一个多星期的时间来追逐'$ resource'的细微差别。 '$ http'非常简单直接,学习曲线彻底消除了'$ resource'中的任何收益。 –

相关问题