REST接口设计与LB思想浅析

“if i rest, i rust!”
教程索引:(持续更新)
loopback中文教程

皓眸大前端开发学习

转载请注明出处:http://www.haomou.net/2015/12/30/2015_loopback_think/

关于REST

此REST非彼rest,关于理论性的知识,阮大师写的很清楚了,附上链接:http://www.ruanyifeng.com/blog/2011/09/restful.html
作者个人认为REST最主要的特点可以用一些关键字来概括:无状态,通用,HTTP协议…..

无状态就有TOKEN

也正应为REST是无状态的,为了做访问权限控制,就需要TOKEN作为令牌,作为访问REST API资源的口令而避免每次都需要账号密码来授权。可以简单地这么理解就行。
关于服务端状态,这个可以到网上看看什么是有状态,什么是无状态,服务端session等等内容。

有TOKEN就有lifetime

正如cookie的有效时间一样,每个TOKEN都是有自己的生存时间的,过了这个时间,这个TOKEN就失效了,那么失效了怎么办?失效了,就不能访问对应的HTTP资源,无法提交请求了。这时候需要刷新TOEKN,获取新的TOKEN。

有HTTP请求就有JSON

当然,也可以不用JSON格式,可以自己定义任意一种协议作为交互数据格式,甚至可以采用TT[L]V协议。而只要因为JS原生支持JSON格式数据,便于操作,所以通用情况下采用JSON格式数据交互。
是否采用REST API作为服务端接口模式,需要考虑的还有很多,上面只是最基础的三个点。当然,有了一些共识的基础点之后,就可以制作一些通用的框架了,便于集成。

LOOPBACK来了

如果你没用过LOOPBACK,那么太遗憾了;如果你用过LOOPBACK,那么你肯定对它既爱又恨。
LOOPBACK官网:loopback.io github:官网有链接
LOOPBACK是一个功能很丰富,很全的,高度可扩展的,开源的NodeJS框架,只需要简单的一些命令,就可以创建服务端REST API。关于介绍参考:LoopBack简介(http://ks.netease.com/blog?id=1746)

爱在简单

简单在于一开始刚使用的时候,真的很简单,你只要创建好数据库结构,就可以。他甚至可以帮你自动生成数据库表结构,自动配置好访问TOKEN,自动生成一些辅助表,自动生成RBAL(role based access control),自动帮你创建一套web API接口说明,自动帮你……..做很多事情。

恨在复杂

但是,有很多事情,LOOPBACK并不能帮你完成。一开始他可以帮你做很多事情,可视一旦你的业务有所拓展,不在局限于简单的登录,发布,修改这些操作,那么你可能需要定制模块,可能要修改一些核心模块,甚至要修改LOOPBACK框架依赖的包包。然而,当你展开它的依赖列表时,你会发现,是那么的多,那么的多,目录层级已经超过了windows操作系统的默认最大层级。所以,你可能要决定自己写模块,剥离需求,好吧,这也是一个可行方案。

LOOPBACK的一些思路

关于如何安装,可以自行参考官网,或者参考:http://ks.netease.com/blog?id=1747

角色定制

LOOPBACK中,关于用户角色的划分,主要分为:动态角色和静态角色。
静态角色:是指譬如管理员角色,拥有绝对的控制权限,或者自定义一个角色,对于默写REST API资源具有访问权限。
动态角色:是指比如是我的订单,我可以修改自己的订单,拥有者 就属于一种动态权限。
例子:
静态权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
User.create([
{username: 'John', email: 'john@doe.com', password: 'opensesame'}, {username: 'Jane', email: 'jane@doe.com', password: 'opensesame'}, {username: 'Bob', email: 'bob@projects.com', password: 'opensesame'}
], function(err, users) {
if (err) return cb(err); //create the admin role Role.create({
name: 'admin'
}, function(err, role) {
if (err) cb(err);
//make bob an admin role.principals.create({
principalType: RoleMapping.USER,
principalId: users[2].id
}, function(err, principal) {
cb(err); });
});
});

动态权限

1
2
3
4
Role.OWNER,	$owner	Owner of the object
Role.AUTHENTICATED, $authenticated authenticated user
Role.UNAUTHENTICATED, $unauthenticated Unauthenticated user
Role.EVERYONE, $everyone Everyone

接口定制

LB中的接口是划分到模型中的,它的目录结构中,用json格式的文件,定义数据结构;用同样名称的js文件定义结构,这样动静分离,还是比较好的设计。

1
2
3
-models
----AAA.json 数据模型AAA配置文件
----AAA.js 数据模型AAA扩展接口文件

LB会根据增删改查,会自动为模型生成一些接口,如果你觉得这些基本的接口,不够用,需要自己写,那么可以自定义远程接口。

1
2
3
4
5
6
7
8
9
10
11
12
module.exports = function(Person){
Person.greet = function(msg, cb) {
cb(null, 'Greetings... ' + msg);
}
Person.remoteMethod(
'greet',
{
accepts: {arg: 'msg', type: 'string'},
returns: {arg: 'greeting', type: 'string'}
}
);
};

文件容器

LB中文件、图片等是放到容器中的,你可以当成桶,也可以自定义桶如何存放文件。LB将对这些文件增删改查的功能也封装成了一套REST API,甚至包含了分片上传。这些可以参考官网,不过考虑的带宽,一般还是采用OSS来处理,所以这里也不多说了。
好吧,这里用一张图结束吧。

谢谢!

转载请注明出处:http://www.haomou.net/2015/12/30/2015_loopback_think/

有问题请留言。T_T 皓眸大前端开发学习 T_T