我有一些我想调用的网络服务。 $resource
或 $http
,我应该使用哪一个?
$resource
:https://docs.angularjs.org/api/ngResource/service/$resource
$http
:https://docs.angularjs.org/api/ng/service/$http
在我阅读了上述两个 API 页面后,我迷路了。
您能否用简单的英语向我解释有什么区别以及我应该在什么情况下使用它们?如何构建这些调用并将结果正确读入 js 对象?
我觉得其他答案虽然正确,但并不能完全解释问题的根源:REST
是 HTTP
的子集。这意味着可以通过 REST
完成的所有事情都可以通过 HTTP
完成,但并非所有可以通过 HTTP
完成的事情都可以通过 REST
完成。这就是 $resource
在内部使用 $http
的原因。
那么,什么时候互相使用呢?
如果您只需要 REST
,即您正在尝试访问 RESTful
网络服务,$resource
将使与该网络服务交互变得超级容易。
相反,如果您尝试访问不是 RESTful
网络服务的任何内容,您将不得不使用 $http
。请记住,您也可以通过 $http
访问 RESTful
网络服务,这将比使用 $resource
麻烦得多。这是大多数人在 AngularJS 之外使用 jQuery.ajax
(相当于 Angular 的 $http
)的方式。
$http
用于通用 AJAX。在大多数情况下,这就是您将要使用的。使用 $http
,您将手动进行 GET
、POST
、DELETE
类型调用并自行处理它们返回的对象。
$resource
包装 $http
以用于 RESTful Web API 场景。
笼统地说:RESTful Web 服务将是一种服务,它具有一个数据类型的端点,该数据类型基于 HTTP 方法(如 GET
、POST
、PUT
、DELETE
等)对该数据类型执行不同的操作。因此,使用 $resource
,您可以调用 GET
以将资源作为 JavaScript 对象获取,然后对其进行更改并使用 POST
将其发回,甚至可以使用 DELETE
将其删除。
......如果这是有道理的。
GET
、POST
、和 DELETE
,那么使用 $resource
服务只会是惯用的/好的?文档 (docs.angularjs.org/api/ngResource.$resource) 显示您通过 $resource
获得了这 3 种 REST 方法。
PUT
或您喜欢的任何其他内容,GET
、POST
和 DELETE
只是默认值。如果您有一个端点为多个 HTTP 方法处理相同资源(这很重要),那么 $resource
是一个不错的选择。
.$promise
在路由和绑定方面的出色表现resolve
。
$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,它会自动附带 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
返回 promise
而 $resource
返回一个对象。还有第三方插件可以帮助 Angular 处理 RESTFul API,例如 restangular
如果 API 类似于 /api/getcarsinfo
。剩下的就是使用 $http
。
/api/getcarsinfo
我想我们仍然可以使用 $resource
我认为答案更多地取决于您在编写代码时是谁您。 如果您是 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
孩子。这很好。”
/user/:userId
或 /thing
)时,$resource 确实非常方便,并且实际上会有所帮助。移至 /users/roles/:roleId
后,您必须在每个 verb 的基础上修改 $resource url 和参数,此时您还不如使用 $http。
$resource
并在某些地方切换到 $http
。我如何希望希望我从未见过$resource
,我怎么强调都不过分。几个月来,我可能已经浪费了一个多星期来追寻 $resource
的细微差别。 $http
非常简单直接,在 $resource
中获得的任何收益都被学习曲线完全抹杀了。
我认为重要的是要强调 $resource 期望对象或数组作为来自服务器的响应,而不是原始字符串。因此,如果您有原始字符串(或除对象和数组之外的任何内容)作为响应,则必须使用 $http
从技术上讲,在 $http
或 $resource
之间进行选择时,没有正确或错误的答案,本质上两者都会做同样的事情。
$resource
的目的是允许您传入模板字符串(包含占位符的字符串)以及参数值。 $resource
会将模板字符串中的 占位符 替换为作为对象传递的参数值。这在与 RESTFul 数据源交互时非常有用,因为它们使用类似的原则来定义 URL。
$http
的作用是执行异步 HTTP 请求。
$resource
不能异步执行?只是想澄清
$http
是执行异步 HTTP 请求的最简单方法,而 $resource
本质上是相同的,但参数不同
资源服务只是使用 REST APSI 的有用服务。当您使用它时,您不会编写 CRUD 方法(创建、读取、更新和删除)
在我看来,资源服务只是一个捷径,你可以用http服务为所欲为。
$http.get('/path/to/thing', params)
与 myResource.get(params)
以及实际为 myResource
进行配置。前面有更多代码,并且只有在 same API 名词下才能真正流畅地工作。否则,您的编码与使用 $http 一样多。
在使用 $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);
}
这只是我的意见。
$resource 服务目前不支持 Promise,因此与 $http 服务有明显不同的接口。
var myResource = $resource(...config...);
那样做,然后在服务的其他地方做 return myResource.get(..params...)
或者你可以做 var save = myResource.save(); save.$promise.then(...fn...); return save;
我能理解的是,如果您要管理 RESTFUL 资源,使用 $resource
将让您在代码中定义一次资源,并使用该资源对资源进行多次操作。这增加了代码的可读性和可维护性。
如果您只想进行通用调用而不是管理它,例如发布、删除、更新,您可以使用 $http
或 $resource
(根据您的喜好)。
不定期副业成功案例分享