首页 文章

AngularJS $ http和$ resource

提问于
浏览
254

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

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

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

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

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

9 回答

  • 2

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

    So, when to use each other?

    如果您只需要 REST ,也就是说,您正在尝试访问 RESTful webservice,那么 $resource 将使得与该Web服务进行交互变得非常容易 .

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

  • 2

    $http 用于通用AJAX . 在大多数情况下,这就是你将要使用的 . 使用 $http ,您将手动进行 GETPOSTDELETE 类型调用并处理它们自己返回的对象 .

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


    非常一般地讲:RESTful Web服务将是一个服务,其中一个 endpoints 用于基于HTTP方法(例如 GETPOSTPUTDELETE 等)对该数据类型执行不同操作的数据类型 . 因此,使用 $resource ,您可以调用a GET 将资源作为JavaScript对象获取,然后更改它并使用 POST 将其发回,或者甚至用 DELETE 删除它 .

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

  • 40

    $http 进行通用AJAX调用,其中 general 表示它可以包含RESTful api和非RESTful api .

    $resource 专门用于RESTful部分 .

    Restful Api 近年来流行,因为网址更好,而不是由程序员组成的随机网址 .

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

    这将给你一个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 .

  • 7

    我认为答案更多地取决于您编写代码时的身份 . Use $http if you're new to Angular, until you know why you need $resource. 除非您具体了解 $http 如何阻止您,并且您了解在代码中使用 $resource 的含义,请坚持使用 $http .

    这是我的经验:我开始了我的第一个Angular项目,我需要向RESTful接口发出HTTP请求,所以我做了你现在正在做的同样的研究 . 根据我在这样的问题中所读到的讨论,我选择了 $resource . This was a mistake I wish I could undo. 原因如下:

    • $http 示例丰富,有用,通常只是您需要的 . 清楚的 $resource 例子是稀缺的,并且(根据我的经验)很少你需要的一切 . 对于Angular新手,你赢得了令人费解的文档,并且生气地说你找不到有用的帮助你的例子.2591230_例子来帮助你 .

    • $http 可能是一对一的思维导图,你需要学习一个新的概念,以了解你得到的东西 $http . $resource 带来了很多细微差别,你还没有心理 Map .

    • 哎呀,我说你不必学习新概念吗?作为一名Angular新手,你必须了解承诺 . $http 返回一个承诺并且 .then 能够,所以它适合你正在学习的关于Angular和promises的新东西 . $resource ,它不直接返回一个承诺,使你对Angular基本原理的初步把握变得复杂化 .

    • $resource 功能强大,因为它会压缩RESTful CRUD调用的代码以及输入和输出的转换 . 那个's great if you'厌倦了反复编写代码来自己处理 $http 的结果 . 对于其他任何人来说, $resource 添加了一个神秘的语法和参数传递层,令人困惑 .

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

  • 23

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

  • 208

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

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

    $http 的作用是执行异步HTTP请求 .

  • 166

    资源服务只是使用REST APSI的有用服务 . 当你使用它时,你不会编写你的CRUD方法(创建,读取,更新和删除)

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

  • 0

    如果你在.net中使用Web API,我注意到使用$ resource超过$ http的一件事

    $ 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);
    }
    

    这只是我的意见 .

  • 30

    $ resource服务目前不支持promises,因此与$ http服务的接口明显不同 .

相关问题