AngularJS $http和$resource

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

$resource: https://docs.angularjs.org/api/ngResource/service/美元资源

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

在我读了上面的两个API页面后,我迷失了。

你能用通俗易懂的英语给我解释一下它们的区别,以及在什么情况下使用它们?我如何构造这些调用,并将结果正确地读入js对象?

84511 次浏览

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

$resource包装了$http以便在RESTful web API场景中使用。


一般来说:一个基于rest的web服务将是一个具有数据类型的端点的服务,该端点基于HTTP方法(如GETPOSTPUTDELETE等)对该数据类型执行不同的操作。因此,使用$resource,你可以调用GET以JavaScript对象的形式获取资源,然后修改它并用POST将其发送回来,甚至用DELETE删除它。

…如果有道理的话。

当涉及到在$http$resource之间进行选择时,从技术上讲,没有正确或错误的答案,本质上两者都是一样的。

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

$http所做的是执行异步HTTP请求。

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

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

如果你所需要的只是REST,也就是说,你正在试图访问一个RESTful web服务,$resource将使它超级容易与该web服务交互。

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

我认为重要的是要强调$resource期望对象或数组作为服务器的响应,而不是原始字符串。所以如果你有一个原始字符串(或任何除了对象和数组)作为响应,你必须使用$http

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

在我看来,资源服务只是一条捷径, 你可以用HTTP服务做任何事情
我注意到一件事,当使用$resource超过$http是 如果你在。net中使用Web API

$resource被绑定到一个执行单一目的的控制器中。

美元资源(/ user /: 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可以是任何东西。只需指定url。

美元http。Get - "api/authenticate"

[HttpGet]
public bool Authenticate(string email, string password)
{
return _authenticationService.LogIn(email, password, false);
}

这只是我的个人观点。

$http进行通用AJAX调用,其中一般意味着它可以包括宁静的 api和Non-RESTful api。

$resource专门用于宁静的部分。

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


}]);

这将给你一个资源对象,它自动伴随着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了。

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

我认为答案更多地取决于你在编写代码时谁是。除非你有具体的经验,知道$http是如何阻碍你的,并且你明白在你的代码中使用$resource的含义,否则坚持使用$http

这是我的经历:我开始了我的第一个Angular项目,我需要向一个RESTful接口发出HTTP请求,所以我做了和你现在做的一样的研究。根据我在这样的SO问题中读到的讨论,我选择$resource。原因如下:

  1. $http的例子是丰富的,有用的,而且通常正是你需要的。清晰的$resource例子很少,而且(以我的经验)很少是你需要的所有东西。对于Angular新手来说,你不会意识到你的选择意味着什么,直到后来,当你困惑于文档,并为找不到有用的$resource示例来帮助你而生气时。
  2. $http可能是一个1对1的心理地图,你正在寻找什么。你不需要学习一个新的概念来理解你用$http得到什么。$resource带来了很多细微差别,你还没有一个心理地图。
  3. 我说过你不需要学习新概念吗?作为Angular新手,你必须学习承诺。$http返回一个承诺,并且是.thenable的,所以它正好适合你在Angular和承诺中学到的新东西。$resource不直接返回承诺,会使你对Angular基础知识的初步掌握复杂化。
  4. $resource功能强大,因为它压缩了RESTful CRUD调用的代码以及输入和输出的转换。如果你厌倦了自己反复编写代码来处理$http的结果,这是很好的。对于其他人来说,$resource添加了一个令人困惑的语法和参数传递的神秘层。

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

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

如果你只是想使用通用调用,而不是像post、delete、update这样管理它,你可以使用$http$resource(随你喜欢)。