ChatGPT解决这个技术问题 Extra ChatGPT

AngularJS $http 和 $resource

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

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

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

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

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

$resource 建立在 $http 之上,并提供了对底层通信的进一步抽象。它还需要一个符合 $resource 模式的 REST 端点。既然你在问,我的建议是从 $http 开始,熟悉一下,然后看看你是否可以转向 $resource。
感谢你的回答。那么,除了我可以熟悉 api 之外,在什么情况下 $http 比 $resource 更受欢迎?

b
bluehallu

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

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

如果您只需要 REST,即您正在尝试访问 RESTful 网络服务,$resource 将使与该网络服务交互变得超级容易。

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


很好的答案,这应该被接受,而不是最上面的那个
这意味着我们有三种方式调用 RESTful??使用 $resource、$http 和 jquery.ajax,对吗?
@JakeHuang 即使没有任何库,您也可以调用它,有无数种方法可以做到这一点。我刚刚介绍了 AngularJS 世界中最流行的两种方法以及它之外最常见的方法。
我可以知道 AngularJS 中最流行的两种方法是什么吗? :p
L
Liam

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

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

笼统地说:RESTful Web 服务将是一种服务,它具有一个数据类型的端点,该数据类型基于 HTTP 方法(如 GETPOSTPUTDELETE 等)对该数据类型执行不同的操作。因此,使用 $resource,您可以调用 GET 以将资源作为 JavaScript 对象获取,然后对其进行更改并使用 POST 将其发回,甚至可以使用 DELETE 将其删除。

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


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

$http 进行通用 AJAX 调用,其中 general 表示它可以包含 RESTful api 和 Non-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');

    }]);

这将为您提供一个 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


这应该是答案。
如果 api 是 /api/getcarsinfo 我想我们仍然可以使用 $resource
这应该是答案。当您说“还有一个区别是 $http 返回承诺而 $resource 返回一个对象”时 1-这是否意味着我不需要将 .then 与 $resource 一起使用? 2- 作为前端人员,这听起来可能很愚蠢,我如何才能确定 api 是否安静?谢谢
@shireefkhatab 1. 是的,$resource 只是 $http 的更高级别抽象,用于 RESTFul API 便利。 doc example 显示了如何使用它。 2. 这完全取决于你的后端人员如何设计 url。如果他想符合 RESTFul api 范式,那么你很高兴
M
Matthew Marichiba

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

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

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

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


我喜欢你的回答,尤其是最后一行。我目前正在使用 $resource 与 $http 进行转变。我还要补充的一件事是,当您使用相同的 API noun(如 /user/:userId/thing)时,$resource 确实非常方便,并且实际上会有所帮助。移至 /users/roles/:roleId 后,您必须在每个 verb 的基础上修改 $resource url 和参数,此时您还不如使用 $http。
称我为精神分裂症患者以评论我自己的答案,但我想我会提到更多最近的经历。我一直在重构以消除 $resource 并在某些地方切换到 $http。我如何希望希望我从未见过$resource,我怎么强调都不过分。几个月来,我可能已经浪费了一个多星期来追寻 $resource 的细微差别。 $http 非常简单直接,在 $resource 中获得的任何收益都被学习曲线完全抹杀了。
s
sparrkli

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


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

从技术上讲,在 $http$resource 之间进行选择时,没有正确或错误的答案,本质上两者都会做同样的事情。

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

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


这是一个很好的答案,因为它指出 $http 是来自 $resource 的请求的动力,并且两者都做同样的事情。
@Dalorzo所以你的意思是说$resource不能异步执行?只是想澄清
不,我指出的是最后 $http 是执行异步 HTTP 请求的最简单方法,而 $resource 本质上是相同的,但参数不同
j
john Smith

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

在我看来,资源服务只是一个捷径,你可以用http服务为所欲为。


我不确定我是否会将 $resource 归类为快捷方式。它是 $http 的包装器,因此直接使用 $http 会“更短”。这是您配置 $http 的一种方式,这样您在使用 $http 时可能会减少代码。在一种情况下,$http.get('/path/to/thing', params)myResource.get(params) 以及实际为 myResource 进行配置。前面有更多代码,并且只有在 same API 名词下才能真正流畅地工作。否则,您的编码与使用 $http 一样多。
j
jayson.centeno

在使用 $resource 而不是 $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);
}

这只是我的意见。


f
firdous

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


$resource 服务确实支持承诺,但它不像 $http 那样直接返回 $promise。你必须像 var myResource = $resource(...config...); 那样做,然后在服务的其他地方做 return myResource.get(..params...) 或者你可以做 var save = myResource.save(); save.$promise.then(...fn...); return save;
D
David Duran

我能理解的是,如果您要管理 RESTFUL 资源,使用 $resource 将让您在代码中定义一次资源,并使用该资源对资源进行多次操作。这增加了代码的可读性和可维护性。

如果您只想进行通用调用而不是管理它,例如发布、删除、更新,您可以使用 $http$resource(根据您的喜好)。