使用REST框架,快速创建WEB-CRUD应用

来源:互联网 发布:好用的炒股软件 知乎 编辑:程序博客网 时间:2024/06/06 11:01
什么是CRUD应用?为什么使用REST框架?

     CRUD应用就是CRUD比较集中的Web应用,也就是通过客户端进行增删查改比较多的分布式Web应用,在SDN中控制器大多数是这种操作。除了SDN中的控制器,很多传统的业务管理的网站也是CRUD操作比较多,而RESTfull的Web框架也适合这样的应用,所以REST很流行。Web框架有两种,一是SOAP架构,一是REST架构,详细区别参考(http://www.ibm.com/developerworks/cn/webservices/0907_rest_soap/index.html)。有很多Web框架支持REST,比如Djongo;在我的实现中使用了Webpy。
     上述那篇文章使用JAVA的Restlet框架支持REST。首先使用URL定义不同的资源;然后定义HTTP方法的语义:PUT=add/update某个resource,GET=select某个resource的具体情况 and select资源列表,DELETE=delete某个resource。然后根据定义的语义与资源编写后端逻辑,在具体开发中,一般响应URL的第一层只是wrapper,调用数据层的API实现CRUD操作。
     W3C中定义SOAP是基于XML的协议,tomcat这个JAVA服务器应该实现了这个协议,所以上文也没有说具体如何开发。SOAP特点是,使用同一的URL定义资源根目录,使用SOAP消息操作具体的资源;使用HTTP POST方法发送SOAP消息,所以感觉浪费了很多HTTP方法与URL。比较这两种方式发现,REST能比较充分的发挥HTTP优势如下。所以REST必将UP起来。
<ul>
     <li>使用HTTP方法与URL,减少server side的处理。</li>
     <li>使用基于HTTP的ROA,每次request完成一个任务,这样server side可以使用LB将request分配到集群的任意节点。</li>
     <li>REST不使用POST而是使用GET/HEAD/DELETE/PUT,据说不影响server的状态而且有幂等性,这样能更好的保证分布式系统的健壮性,(我也不懂)。</li>
     <li>安全控制:这个比较好理解,操作如果都封装在SOAP中肯定不如在HTTP header中利于网络的处理。</li>
     <li>REST使用GET这样HTTP的方法可以更好的使用HTTP缓存服务。</li>
     <li>前端使用REST也更符合前端的逻辑,例如前一步操作是GET:/users,后一步操作是GET:/user/alice,这样前端web开发也更方便。</li>
</ul>


我要如何支持REST框架?

     我的工程是使用REST开发的操作OVS的WEB控制界面,实质就是CRUD操作的Web应用。README.MD文件解释了基本框架,前端暂时不提,先解释一下REST定义。我使用GET表示select(可使用Http的cache),使用POST表示update/delete/add操作。Url的定义见/backend/app.py,大部分以bridge为根,也就是很多操作都是基于bridge的。app.py这一层是wrapper层,使用了工具进行CRUD操作,这里是专门的OVS的工具,可以换成其他的数据库操作。
     前端使用angularJS框架实现MVC,view界面使用angularJS自带的框架,controller使用controller.js,data的获取使用controller中使用内置的$http服务从backend那边获取。而使用内置$http服务的method与url也是按照REST和上面定义的来做。


如何搭建这个框架?

     首先需要配置基本的服务器,我这里使用lighttpd-1.4.36,配置文件使用标准的配置文件基础上修改自己的配置如下。启动服务器的命令按照lighttpd启动命令就好。
<ul>
     <li>基本配置:日志路径、home路径、conf路径、html文件路径</li>
     <li>定义需要的modules:这个在apache或者ngnix一样,我这里除了基本module之外,多配置了fastcgi。</li>
     <li>fastcgi配置:后面详细解释,这里配置了fastcgi的socket、bin-file配置成app.py、最大线程数、运行时环境。</li>
     <li>url重定向:这个其实是内部将HTTP报文的URL转换,例如*/js/*被定向到.../frontend/js/...文件夹,其他html请求被定向到app.py。经过这样的重定向,URL中请求资源的(例如js文件、照片、css、font等)可以被很快的定向到相应的文件夹中,而其他需要逻辑处理的URL(例如www.abc.com/users?user=sam)可以被app.py这个入口的CGI文件处理。</li>
</ul>
     然后需要安装webpy框架,参考(http://timyang.net/python/python-rest/),有几点要注意。一是性能问题,Tim说错了,下面有说明;二是业务逻辑控制方面JAVA可能更精细一些;三是webpy与Django等python框架使用WSGI(https://www.python.org/dev/peps/pep-0333/),类似JAVA的servlet,封装了request、response、header、data等http的内容;四是通过webpy框架,隐藏了上一条说的裸http的东西,封装成一个REST框架,JAVA肯定也有框架将servelet封装,例如spring、EJB(这个我不懂,后面会看的)。
     是否要用Flup?我没有使用,Flup看解释是Server/Gateway中的server,lighttpd是gateway,我的应用很小访问量也不大,暂时不需要这种机制。另外参考(http://www.douban.com/note/13508388/)讲述了几者关系,WSGI是python服务器支持的框架,Flup是Server/Gateway模式下的server,webpy是将裸的request、response、session、header、data等封装成一个易于使用的REST框架。
     前端如何组织?前端组织中,JS文件使用AngularJS的框架;html文件也是followJS框架,使用partial文件夹将不同模块划分出来;还有css、img、font这三个辅助文件夹没有上传,因为那个自己搞定就好。前端开发中基本follow AngularJS教程就好,要注意几点:JS加载的代码写在html后面;使用ng-XXX时候注意将控制域设置好。
     后端如何组织?后端基本工作是根据URL调用命令访问数据库,采用分层的方式。app接受URL,转而调用中间层,中间层再调用数据层。app负责解析URL,当然使用REST之后简单很多。中间层是app调用下来的,中间层将请求转为具体的数据库操作,调用数据层。数据层实现了数据库的操作。通过这样的方式,可以很方便的替换数据库,修改业务逻辑,修改上层API。


后面打算做什么?

     学习JEE开发,使用ODL进行二次开发。
0 0