AngularJS $http 和 $resource

IT技术 javascript web-services angularjs
2021-01-20 19:58:33

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

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

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

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

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

6个回答

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

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

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

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

@JakeHuang 即使没有任何库,您也可以调用它,有无数种方法可以做到。我刚刚公开了 AngularJS 世界中两种最流行的方法以及它之外最常见的方法。
2021-03-18 19:58:33
我可以知道 AngularJS 中两种最流行的方法是什么吗?:p
2021-03-22 19:58:33
很好的答案,这应该被接受,而不是最重要的
2021-04-03 19:58:33
这意味着我们可以通过三种方式调用 RESTful??使用 $resource、$http 和 jquery.ajax ,对吗?
2021-04-04 19:58:33

$http用于通用 AJAX。在大多数情况下,这就是您将要使用的。随着$http您将要进行GET, POST,DELETE手动键入调用并自行处理它们返回的对象。

$resource包装$http用于 RESTful Web API 场景。


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

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

@KevinMeredith:或者任何数量的方法。您可以添加PUT或其他任何您想要的,GETPOST并且DELETE只是默认值。如果您有一个端点为多个 HTTP 方法处理相同的资源(这很重要),那么这$resource是一个不错的选择。
2021-03-17 19:58:33
那么$resource 处理的是Restful 服务,也就是说它也可以用来调用普通的Web 服务?因为它确实 GET POST DELETE PUT 所有这些。那么,在什么情况下 $http 比 $resource 更受欢迎?
2021-03-19 19:58:33
@blesh,所以使用$resource的服务只会惯用/好,如果你的REST终端支持GETPOST DELETE文档(docs.angularjs.org/api/ngResource.$resource)显示您使用$resource.
2021-03-27 19:58:33
真的任何时候你都没有处理一个真正宁静的端点。例如,如果您的端点只允许 GET,它会添加许多您不需要的功能。
2021-04-01 19:58:33
即使对于非 RESTful 端点,我发现将 $resource 用于 GET 和 QUERY 类型数据也很方便。鉴于这种方式.$promise适用resolve于路由和绑定。
2021-04-10 19:58:33

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

    }]);

这会给你一个资源对象,它自动伴随着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返回promisewhile$resource返回一个对象。还有一些第三方插件可以帮助 Angular 处理RESTFul API,比如restangular


如果 API 类似于/api/getcarsinfo. 我们剩下的就是使用$http.

这应该是答案。
2021-03-22 19:58:33
如果api是/api/getcarsinfo我想我们仍然可以使用$resource
2021-03-22 19:58:33
这应该是答案。当您说“还有一个区别是 $http 返回 promise 而 $resource 返回一个对象”时 1- 这是否意味着我不需要将 .then 与 $resource 一起使用?2- 也作为前端人员,这听起来可能很傻,我怎么才能知道 api 是否安静?谢谢
2021-03-22 19:58:33
@shireefkhatab 1. 是的,$resource 只是 RESTFul API connivence 的 $http 的更高级别抽象。文档举例说明了如何使用它。2.这完全取决于您的后端人员如何设计网址。如果他想符合RESTFul api范式,那你就可以了
2021-04-08 19:58:33

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

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

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

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

称我为精神分裂症患者对我自己的回答发表评论,但我想我会提到更多最近的经历。我一直在重构以消除$resource并切换到$http某些地方。我多么希望我从未见过$resource我可能已经浪费了一个多星期来追查$resource几个月来的细微差别$http如此简单和直接,任何获得的收益都$resource被学习曲线彻底抹去。
2021-03-25 19:58:33
我喜欢你的回答,尤其是最后一行。我目前正在转变使用 $resource 与 $http。我还要补充的一件事是,当您使用相同的 API名词时, $resource 真的只派上用场,并且实际上有帮助,例如/user/:userIdor /thing一旦你移动到/users/roles/:roleId那么你必须在每个动词的基础上修改 $resource url 和 params并且你可能在那时使用 $http 。
2021-04-11 19:58:33

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

我相信 $http 支持对象、数组和字符串——不过我需要对此进行确认
2021-03-16 19:58:33
@Shardul ,我知道 $http 处理任何类型的响应,但 $resource 仅处理对象和数组。
2021-03-29 19:58:33
不正确,您仍然可以使用 $resource 返回字符串。在前端代码中使用“transformResponse”将返回的字符串包装在一个对象中。
2021-04-02 19:58:33
这是否意味着 $http 不支持对象和数组?只是想澄清一下。
2021-04-09 19:58:33