258

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

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

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

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

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

4

10 回答 10

210

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

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

如果您所需要的只是REST,也就是说,您正在尝试访问一个RESTfulWeb 服务,$resource那么与该 Web 服务的交互将变得超级容易。

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

于 2014-05-27T17:01:31.100 回答
170

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

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


非常笼统地说:RESTful Web 服务将是一种服务,它具有一个数据类型的端点,该数据类型基于 HTTP 方法(如GETPOSTPUTDELETE等)对该数据类型做不同的事情。作为 JavaScript 对象,然后对其进行更改并使用 . 将其发回,甚至使用.$resourceGETPOSTDELETE

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

于 2012-11-01T17:07:27.763 回答
41

$http进行通用AJAX调用,其中通用意味着它可以包括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');

    }]);

这将为您提供一个资源对象,它会自动附带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上的每个常见操作。还有一个区别是return while$http返回一个对象。还有第三方插件可以帮助 Angular 处理RESTFul API,比如restangularpromise$resource


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

于 2015-08-08T00:29:21.440 回答
30

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

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

  1. $http示例很多,很有帮助,而且通常正是您所需要的。清晰$resource的例子很少,而且(根据我的经验)很少有你需要的一切。对于 Angular 新手来说,直到后来,当您对文档感到困惑并为找不到有用$resource的示例来帮助您而感到愤怒时,您才会意识到您选择的含义。
  2. $http可能是您要查找的内容的一对一心理地图。您无需学习新概念即可了解您所获得的内容$http$resource带来了很多你还没有心理地图的细微差别。
  3. 哎呀,我是说你不必学习新概念吗?作为 Angular 新手,你必须了解 Promise。$http返回一个 Promise 并且是有.then能力的,所以它正好适合你正在学习的关于 Angular 和 Promise 的新东西。$resource,它不直接返回承诺,使您对 Angular 基础知识的初步掌握变得复杂。
  4. $resource is powerful because it condenses the code for RESTful CRUD calls and the transformations for input and output. That's great if you're sick of repeatedly writing code to process the results of $http yourself. To anyone else, $resource adds a cryptic layer of syntax and parameter passing that is confusing.

I wish I knew me 3 months ago, and I'd be emphatically telling myself: "Stick with $http kid. It's just fine."

于 2016-02-04T22:26:38.227 回答
24

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

于 2014-08-01T12:55:44.040 回答
7

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

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

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

于 2014-05-26T01:34:44.183 回答
2

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

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

于 2014-11-22T16:09:28.560 回答
2

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

这只是我的意见。

于 2015-08-06T02:13:20.887 回答
0

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

于 2016-01-12T12:18:49.510 回答
0

What I could understand is that if you are having a RESTFUL resources to manage, using $resource will let you define the resource once in code, and use the resource for multiple operations on the resource. This increases the readability and maintainability of the code.

If you just want to have general purpose calls not managing it like post, delete, update, you may go with $http or $resource (as you prefer).

于 2020-08-15T12:17:27.570 回答