AngularJS的$resource

本文探讨了在AngularJS中与RESTful风格的WebServices进行交互的方法,包括使用$http服务的基本概念、配置及高级特性,以及如何通过$resource服务简化与RESTful API的交互,提供更优雅的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.kazaff.me/2013/08/16/angularjs%E7%9A%84resource/

要在项目中彻底的使用单入口的前端mvc框架来开发,那么都会把和后端交互获取数据改成异步Ajax,这样的话,后端就相当于一个WebServices,比较轻量级的方案就是RESTful,这个不是我们要讨论的内容,我们把注意力放在前端上:如何用AngularJS来和rest风格的WebServices进行交互呢?

熟悉Ajax的童鞋,肯定脑子里第一时间想到的就是XMLHTTPRequest。
没错,但是用的最多的,应该还是jQuery封装的$.ajax()。

我们再来看看AngularJS怎么做的,它提供了一种比较底层的API:$http
这个$http服务是ng的核心服务,它封装了XMLHttpRequest对象,同时也支持JSONP。
我们今天要说的$resource服务是建立在$http上的,提供了更好的配合RESTful的接口。但是,我们还是要花篇幅来从$http说起~


$http


$http服务是基于 $q 服务的,提供了promise封装,它接受一个配置对象参数,并返回一个promise对象。同时,它还提供了2个方法用来定义Promise回调:success 和 error。
$http({method:"GET", url:"/someUrl"}). success(function(data, status, headers, config){ //当异步请求成功返回响应时触发}).error(function(data, status, headers, config){ //当发生异常时触发 });

由于常用的http请求就那么几种,$http服务实现了对应的简便方法,比方说:
$http.get
$http.post
$http.put
$http.delete
$http.head
$http.jsonp

$http为每次请求自动添加了HTTP header,可通过$httpProvider.defaults.headers来配置相关内容。

$httpProvider.defaults.headers.common设置了所有请求都会包含的头信息:

Accept: application/json, text/plain, * / *
x-Requested-With: XMLHttpRequest

$httpProvider.defaults.headers.post设置了POST请求的默认请求头:

Content-Type: application/json

$httpProvider.defaults.headers.put设置了PUT请求的默认请求头:

Content-Type: application/json

此外,关于$http的cache特性,推荐看一下这篇文章

那么$http的相关内容,就先到此为止。


现在,我们开始看看$resource,需要注意的是,该服务需要我们手动加载angular-resource.js文件~
$resource服务的核心价值在于:提供给开发者与RESTful风格WebServices交互的更好的用户体验,它封装了较为低级的$http,这样就不需要前端开发者写大量的异步请求代码了。

$resource服务的配置方法:
$resource(url[, paramDefaults][, actions]);
看一下它的三个参数:


url


字符串类型,其中可以出现占位符,占位符要以“:”为前缀,如果系统的域名带端口号的话,需要手动转义:
http://www.codingcool.com:8080/api 应该这么传入:
$resource("http://www.codingcool.com\\:8080/api");
这种情况在ng的1.2.0rc1版本已经不存在了,端口号会被识别而不需要手工转义~~


paramDefaults(可选)


对象类型,用于设置参数的默认值,它设置的数值可以被actions(第三个参数)进行覆盖。如果设置的参数值是函数,那么该函数将在每次获取其值时被执行(有那么点废话的意思)。

对于设置的没有出现在url模板(第一个参数)中的参数,将会以search query的方式添加,例如:
如果url模板为/codingcool/:author,paramDefaults为{author:”kazaff”, profession:”geek”},那么最终的请求url会变成:
/codingcool/kazaff?profession=geek

如果参数值是以“@”开头的,那么其真实值将会从数据对象中提取,后面会有例子。


actions(可选)


对象类型,用来定义$resource提供的可以使用方法,声明细节和 $http 一样。

下面再来看一下$resource的返回值:
返回值的类型是对象,它包含了和指定服务api(即url)进行互动的所有方法,默认会包含如下默认方法:
'get': {method:'GET'}, 'save': {method:'POST'}, 'query': {method:'GET', isArray:true}, 'remove': {method:'DELETE'}, 'delete': {method:'DELETE'} };
这些方法会调用内置的$http服务~

当异步请求成功,数据从服务器端取回后,被封装到一个$resource服务的一个对象实例中,这个对象可以被save,remove,delete方法直接操作,这种封装并提供简单的CRUD操作的方式,使得开发者可以感受到被尊重啊!呵呵~
var User = $resource('/user/:userId', {userId:'@id'}); var user = User.get({userId:123}, function() { user.abc = true; user.$save(); });
注意上面代码中的”@id”和”$save()”,使用了@后,当执行$save时,user.id就会被当做userId的值来发送请求。

这种方式封装Ajax,不仅仅使得代码更加优雅,而且还能配合ng的视图渲染:当数据没有返回之前,模板引擎不会渲染,一旦异步数据获取完成,会自动触发模板引擎的渲染机制把数据呈现到视图中。

最后,看一个简单的例子:

{{user.msg}}


服务器端提供数据的页面,我就不贴了,没什么参考价值~

over~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值