一.REST介绍
表述型状态转移(REpresentational State Transfer, REST)
Web和REST之间有什么关系呢?
我们来聊聊组成Web的几大基础技术,URI(统一资源标识符,用来标识资源)、HTTP(超文本传输/转移协议,用来操作资源)、Hypertext(超文本,用来描述资源的内容与状态,我们可以用HTML、XML、JSON或者自定义格式的文本来描述任何一个资源)。
其实REST并不是一种新兴的技术语言,也不是什么新的技术框架。准确来说说REST只是一种概念、风格或者约束,是回归HTTP本身的建议。
REST是由Roy Thomas Fieding在他的博士论文《Architectural Styles and the Design of Network-based Software Architectures》(《架构风格与基于网络的软件架构设计》)中提出的一种架构思想。在REST中我们关注技术实际上只是URI、HTTP、Hypertext而已。
Roy在他的论文中提出了一个RESTful应用应该具备的几点约束。
每个资源都应该有一个唯一的标识
使用标准的方法来更改资源的状态
Request和Response的自描述
资源多重表述
无状态的服务
REST和RPC之间还是有很大的差异的。
REST强调资源有唯一的URI;而RPC更加强调过程(动词),由统一的接口来调用它们。
REST回归HTTP最初的设计;RPC仅仅只是把HTTP作为传输协议来使用。
REST是由超文本驱动的;RPC是由方法驱动的。
REST强调HTTP通信的语义可见性,通过消息头和标准的HTTP方法来体现;RPC把语义封装在HTTP消息体中。
二.REST的应用场景
REST最适合的应用场景其实是需要对外暴露服务的时候,这个时候,我们可以充分利用REST的自描述、无状态、唯一标识等特性来提供清晰、友好的API,而且现在的Jesery、RESTEasy等JAX-RS框架也提供了OAuth的支持,基本上能够保证服务安全。
最不适合的应用场景是对性能要求高的系统内部之间的服务调用,当你在这个时候使用REST的话,那么REST所有的特性都会变成拖累。这个时候,还是需要选择更底层的通信协议和方式会更好一些,比如ICE。
三.规划REST服务
要规划一个REST服务的时候,其中最关键的概念其实就是“资源”。
狭义的讲(在Web环境中),它是一个可以存放、连接在计算机上,可以通过比特流进行操控的实体。一个实体想成为资源,它必须有一个URI。在这里URI包含了两重含义:1)它是资源的名称 2)它是资源的地址。
规划URI的时候,有几点希望能够注意一下:
一个URI标识一个资源,但是一个资源可以被多个URI标识。
资源也是有层次的,这个层次应该在URI上充分的体现出来。
在规划URI的时候,需要定义一些团队内部确认的关键字或符号,这些关键字或符号是有特殊意义的,不能随便使用。
需要有一个URI定义的文档,以备以后的查询和维护。
可以使用URI Template来描述URI的定义。
当我们定义好资源之后,接下来要做的事情就是定义操作资源的方法以及资源的表述格式了。使用HTTP提供的基本方法来对资源进行操作,一般的操作定义如下:POST(创建资源)、GET(获取资源)、PUT(修改资源)、DELETE(删除)。它们正好对应了CRUD。对资源的表述,一般的选择会是XML,但是我更加推荐使用JSON来表述资源。在网络中的传输量也小,而且也便于JavaScript来解析,,而且现在其他语言解析也是非常方便。
四.选择一个快速方便的REST框架
推荐使用Jersey和RESTEasy来创建自己的REST服务。
Jersey是由SUN提供的JAX-RS实现参考,对JAX-RS支持的最为充分和快速,基本上所有的JAX-RS的新特性都会在Jersey里第一个体现出来;RESTEasy则是有JBoss开源的项目,它同样有很多优点,而且文档也比Jersey更好一些,但是和JBoss应用服务器绑定的比较紧密。
五.发布REST服务需要注意的地方
对外暴露API时,需要注意版本规划,以便以后API的升级和维护,一旦某个API要升级,输入和输出发生变化的时候,你根本不知道该通知谁来升级,解决问题的时候也非常麻烦。
由于对外暴露API之后,你很难控制API被调用的次数和意图,需要在一些关键的API被调用的次数和频率上进行控制,以免受到恶意的攻击。但是,到底次数和频率应该控制在一个什么样的程度,就要看你的API的关键程度以及负载能力
由于现在浏览器的限制,只能使用HTTP的GET和POST方法,如果通过AJAX直接调用REST服务,当你的服务中需要使用HTTP的PUT或者DELETE方法来调用的话,最好是考虑使用重载POST方式将需要使用PUT和DELETE方法调用的服务能够通过POST来调用。
摘自
http://kb.cnblogs.com/page/91827/