AngularJS $ http和$ resource

时间:2012-11-01 16:27:58

标签: javascript web-services angularjs

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

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

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

在我阅读上述两个API页面后,我迷路了。

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

10 个答案:

答案 0 :(得分:209)

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

那么,什么时候互相使用?

如果你需要的只是REST,也就是说,你正在尝试访问RESTful网络服务,$resource将使得与该网络服务进行交互变得非常容易。

相反,如果您尝试访问不属于RESTful网络服务的任何内容,则必须使用$http。请注意,您还可以通过RESTful访问$http网络服务,这比使用$resource要麻烦得多。这是大多数人在AngularJS之外使用jQuery.ajax(相当于Angular的$http)的方式。

答案 1 :(得分:166)

$http用于通用AJAX。在大多数情况下,这就是您正在使用的内容。使用$http,您将GETPOSTDELETE手动键入调用并处理他们自己返回的对象。

$resource包装$http以用于RESTful Web API方案。


非常一般地说:RESTful Web服务将是一个服务,其中一个端点用于数据类型,该数据类型基于HTTP方法(例如GETPOST,{{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,其中会自动附带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...
        }

了解我们如何在 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这是一个我希望我可以撤消的错误。这就是原因:

  1. $http示例丰富,实用,通常只是您需要的内容。清楚的$resource例子很少,而且(根据我的经验)很少你需要的一切。对于Angular新手,你不会意识到你选择的含义,直到后来,当你对文档感到困惑并且生气,你找不到有用的$resource例子来帮忙你出去了。
  2. $http可能是您所寻找的一对一心理地图。您不必学习新概念来了解$http所获得的内容。 $resource带来了很多细微差别,你还没有心智地图。
  3. 哎呀,我说你不必学习新概念吗?作为一名Angular新手,你必须了解承诺。 $http会返回一个承诺并且.then能够,因此它适合您正在学习Angular和承诺的新内容。 $resource,它没有直接返回承诺,使你对Angular基本原理的初步掌握变得复杂。
  4. $resource功能强大,因为它会压缩RESTful CRUD调用的代码以及输入和输出的转换。如果您厌倦了反复编写代码来处理$http自己的结果,那就太棒了。对于其他任何人来说,$resource添加了一个神秘的语法和参数传递层,令人困惑。
  5. 我希望我在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(根据需要)。