AngularJS $ http和$ resource

Tom*_*Tom 256 javascript web-services angularjs

我有一些我想打电话的网络服务.$resource或者$http,我应该使用哪一个?

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

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

在我阅读上面两个API页面后,我迷失了.

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

blu*_*llu 210

我认为其他答案虽然正确,但并未完全解释问题的根源:REST是其中的一部分HTTP.这意味着可以通过所有可以完成的事情REST来完成,HTTP但并非所有可以通过的HTTP方式完成REST.这就是内部$resource使用的原因$http.

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

如果您只需要REST,即尝试访问RESTfulWeb服务,$resource那么就可以非常轻松地与该Web服务进行交互.

相反,如果您正在尝试访问不是RESTfulWeb 服务的ANYTHING ,那么您将不得不继续使用$http.请记住,您也可以访问网络RESTful服务$http,这将比使用它更麻烦$resource.这是大多数人通过使用jQuery.ajax(相当于Angular的$http)在AngularJS之外进行的方式.

  • 很好的答案,这应该被接受,而不是顶部的那个 (21认同)
  • $ resource和$ http,阅读答案:p (14认同)
  • @JakeHuang你可以在没有任何库的情况下调用它,有无限的方法可以做到这一点.我刚刚介绍了AngularJS世界中最流行的两种方法,以及它之外最常用的方法. (4认同)
  • 这意味着我们有三种方法可以调用RESTful?使用$ resource,$ http和jquery.ajax,我是对的? (2认同)

Ben*_*esh 167

$http用于通用AJAX.在大多数情况下,这就是你将要使用的.随着$http你将要作出GET,POST,DELETE手动键入和处理他们在自己返回的对象调用.

$resource包装$http以在RESTful Web API方案中使用.


概而言之:RESTful Web服务将与一个端点为基于HTTP的方法,如与数据类型进行不同的处理数据的服务类型GET,POST,PUT,DELETE,等于是用一个$resource,你可以调用一个GET获取资源作为JavaScript对象,然后改变它并用a发送回来POST,甚至删除它DELETE.

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

  • @KevinMeredith:或者它有多种方法.你可以添加`PUT`或你想要的任何其他东西,`GET`,`POST`和`DELETE`只是默认值.如果你有一个端点处理多个HTTP方法的*相同资源*(这很重要),那么`$ resource`是一个不错的选择. (9认同)
  • 真的,任何时候你都没有处理一个真正宁静的端点.例如,如果您的端点仅允许GET,它会添加许多您不需要的功能. (7认同)

Qia*_*ang 41

$http进行通用的AJAX调用,其中一般意味着它可以包括RESTful api和非RESTful api.

$resource专门用于RESTful部分.

Restful Api近年来普遍流行,因为url组织得更好,而不是程序员编写的随机url.

如果我使用RESTful 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');

    }]);
Run Code Online (Sandbox Code Playgroud)

这会给你的资源对象,它是伴随着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...
        }
Run Code Online (Sandbox Code Playgroud)

了解我们如何在RESTFul API上定义每个常见操作.还一个区别是,$http返回promise$resource返回的对象.还有第三方插件可以帮助Angular处理RESTFul API,例如restangular


如果API是这样的/api/getcarsinfo.所有留给我们的都是使用$http.

  • 这应该是回答者. (4认同)

Mat*_*iba 30

我想答案更多地取决于谁,你是在你写代码的时间.如果您是Angular的新手,请使用$http,直到您知道为什么需要$resource.直到你有关于如何$http阻止你的具体经验,并且你理解$resource代码中使用的含义,坚持下去$http.

这是我的经验:我开始了我的第一个Angular项目,我需要向RESTful接口发出HTTP请求,所以我做了你现在正在做的同样的研究.根据我在这样的SO问题中的讨论,我选择了$resource.这是一个错误,我希望我可以撤消.原因如下:

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

我希望我在3个月前认识我,并且我会强调告诉自己:"坚持$http孩子.这很好."

  • 叫我精神分裂症,评论我自己的答案,但我想我会提到最近的经验.我一直在重构消除`$ resource`并在某些地方切换到`$ http`.我无法强调我希望多少愿望*我从未见过`$ resource`.我可能浪费了一个多星期的时间来追逐"$ resource"的细微差别.`$ http`是如此简单明了,`$ resource`中的任何收益都被学习曲线彻底消灭了. (3认同)

spa*_*kli 24

我认为重要的是要强调$ resource期望对象或数组作为服务器的响应,而不是原始字符串.因此,如果您将原始字符串(或除对象和数组之外的任何内容)作为响应,则必须使用$ http


Dal*_*rzo 7

当谈到选择$http或从$resource技术上讲,没有正确或错误的答案本质上都会做同样的事情.

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

什么$http是执行异步HTTP请求.