AngularJS提供了$resourceService来更方便地与RESTful服务进行交互,可以方便地定义一个REST资源,而不必手动声明CRUD方法。
如何使用Resource?
具体步骤如下:
- 引入angular-resource.min.js文件
- 在模块中依赖ngResourece,
- 在服务中注入$resource
示例代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19//定义
var Topic = angular.module('Topic',['ngResource']);
Topic.factory('topicResource',function($resource){
return $resource('/topic/:id',
{
id:'@id'
},
{
close:{
method:'POST',
params:{close:true},
isArray:false
}
}
);
});
//调用,对id为123的topic执行close操作
topicResource.close({id:123}, successFn, errorFn)
$resource的参数说明
$resource(url,{url参数},{自定义方法})
- url: 必填, 资源的基础url,url中带有’:’项的是根据第二个参数来进行配置的。
- url参数: 选填,配置url中的带有’:’ 项的参数。例如: (‘/card/user/:userID/:id’, {userID:123,id:’@id’}), 那么userID会被配置为123.。另外,在调用$resource()的方法的时候(比如get,query…),可以传入参数覆盖这里对url参数的配置。
- 自定义方法: 选填,使用$resource获取到的资源,或者通过$resource实例化的资源,资源本身会具有一些方法,比如$save,第三个参数用于给资源添加自定义的方法。
$resource的方法
$resource()默认有如下5个方法:
- get: {method:’GET’} 一般用于获取某个资源.
- query: {method:’GET’,isArray:true},一般用于获取一整套的资源,isArray参数,用以设置返回数据格式,是否是数组。默认是true。
- save: {method:’POST’},一般用于保存某个资源,有可能是新建的资源,也有可能是更新现有的资源
- remove: {method:’DELETE’},一般用于删除某个资源
- delete: {method:’DELETE’} , 一般用于删除某个资源
$resource的响应方法
Resource.action([parameters], [success], [error])
- [parameters]: 可选. 一个json对象,用于配置url里的参数,比如这里写了{id:cardID},那么提交的请求url就是 ‘/card/user/123/cardID’. 可以不填,不填就直接按照$resource()里的url来提交,注意,不填的话,不需要给个空,可以直接写success回调,angular能够判断出它没有填第一个参数,而不是死板的按照顺序来解读参数.
- [success]:可选. 请求成功后的回调函数.回调接受2个参数(注意这里和$http有所不同)function(data, responseHeaders)
- [error]:可选. 请求失败后的回调.回调接受1个参数 function(httpResponse){ }
注意:凡是通过$resource返回的对象,一定是json格式的,如果后台返回的数据不是json,$resource也会按照自己的方式处理成json格式.不能返回null,因为$resource必须返回json格式,所以要返回{}
#响应转换
有时基于既定的后台设计,无法提供完全RESTful的API,比如返回的是一个分页器对象,而非数组。此时,我们仍然可以使用$resource,但需要设置响应转换回调。例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34/*
API返回的是一个分页对象,需要读取其中的数组数据。
{
currentPage : 1,
totalPage : 20,
pageSize : 2,
content : [
{
id : 1,
body : 'hello'
},
{
id : 2,
body : 'world'
}
]
}
*/
//定义
var Topics = $resouce('/topic/list/page/:pageid', null, {
page: {
method : 'GET',
transformResponse: function(data, headers){
var pager = JSON.parse(data);
return pager.content;
}
}
});
//调用
Topics.page(function(data){
//此时data已经是转换过的数组了
});
当然上述转换,也可以在响应函数中进行相关的数据格式处理。
类似响应重写,你还可以设置请求转换transformRequest。