基于Restful的API

基于Restful的API

近期的项目中用到了REST风格的API设计, 和传统的API相比,REST更面向服务,也更减少了程序的耦合度。而且在今后的一大段时间里,REST风格的设计将会越来越流行。
我之所以敢这么说,因为Spring3.X中引入了全面的REST支持:




因为新浪微博用的就是Restful的API设计,因为最新版本的JDK中也加入了REST的支持。当然现在已经有好多的公司采用了这套风格的设计。这些足以说明今后在API设计上的一个方向。当然,spring的支持是一个巨大的推动力,我发现哪里都有他的影子啊!!

在五花八门的技术里,你很容易发现,基于SOA的开发与REST有那么点儿相似,然后你会思考到底选择哪种方式更好,这个问题稍后再讨论。接下来先简单表述一下REST。

REST(REpresentational State Transfer),中文翻译为表述性转移。这个概念在Roy Thomas Fielding的paper中得到了很好的论证。文章的题目叫《Architectural Styles and the Design of Network-based Software Architectures》,是一篇架构描述不可多得的文章,非常值得一看。

REST的风格主要有以下特点:
1、REST风格 的服务是通信无状态的(communicate statelessly)
从客户端向服务器发出的每一次请求都必须包含理解该请求的所有必须信息。不能利用服务器上的上下文。
2、具有统一的接口。
如:GET、POST、DELETE、PUT等,这些接口能基本完成日常所需的CRUD操作。
3、所有信息都被抽象为资源,并用一个URI唯一标识。
4、REST组件通过交换资源的表述来对资源进行处理,资源的多重表述。
如后台的多样化返回:XML或JSON等。这是REST和RPC(Remote Procedure Call)方法的主要区别。

REST强调的是组件交互的伸缩性,接口的通用性,组件部署的独立性。以JWS为例,在实际开发中可以用XSLT和JAXP完成数据的转换工作。所以,我们可以用JWS方式来部署REST服务。又回到了之前提出的疑问了,SOA这样的架构或者拿CXF写的服务和REST之间到底有什么区别。

个人认为,使用REST风格来做服务的话,对程序的侵入性可以讲到很低,不用像传统的WSDL开发那样,往自己程序里写东西。而且REST的统一接口有利于服务的维护。当然也正是因为使用这些统一接口使得服务的灵活性不是那么的好,虽然减少了服务端的开发量,但是增加了前台的开发量。所以我觉得可以将两者结合开发,针对那些通用的,对外的可用REST风格包装成Facade,而那些特定的,需要订制的,则采用SOA的方式部署。

下面说说最近项目里用到的Restful框架,RESTLET。
摘一段官方的introduction吧:
The Restlet Framework is composed of two main parts. First, there is the "Restlet API", a neutral API supporting the concepts of REST and facilitating the handling of calls for both client-side and server-side applications. This API is backed by the Restlet Engine and both are now shipped in a single JAR ("org.restlet.jar").




This separation between the API and the implementation is similar to the one between the Servlet API and Web containers like Jetty or Tomcat, or between the JDBC API and concrete JDBC drivers.
Demo的源码官网上也都会有,这个框架还是不错的,而且有相应的discussion论坛。http://restlet-discuss.1400322.n2.nabble.com/

下面是一篇很好的关于Restlet的文章:
来自InfoQ: http://www.infoq.com/cn/articles/restlet-for-restful-service

最后我想用Dr. Roy Thomas Fielding文中的一段描述REST的文章来总结这个小节:
REST is a coordinated set of architectural constraints that attempts to minimize latency and network communication while at the same time maximizing the independence and scalability of component implementations. This is achieved by placing constraints on connector semantics where other styles have focused on component semantics. REST enables the caching and reuse of interactions, dynamic substitutability of components, and processing of actions by intermediaries, thereby meeting the needs of an Internet-scale distributed hypermedia system.

以上只是一种思路,具体的实现网上应该都有成篇的代码。个人愚见,谢谢观看。

本文原创,转载请指明出处,谢谢。

猜你喜欢

转载自ielts0909.iteye.com/blog/1502555