深入理解REST(二)

来源:互联网 发布:java springmvc 编辑:程序博客网 时间:2024/05/16 05:13
 

 

2.      RESTWEB中的应用

2.1  当前WEB应用存在的主要问题

当前WEB应用非常强调交互性和个性化,为了达到这个目的,通常的做法是:服务器和每一个客户端都会建立一个Session,记录客户端的状态,并根据客户端的操作动态生成一些个性化的内容。例如Java Servlet,通过HttpSession API我们可以在状态和特定用户之间建立关联,把有关Session的所有信息都记录下来。这看起来似乎很简单,也很“理所当然”。但是当我们开始在 HttpSession 中放入更多对象时,就会开始注意到我们的应用服务器要占用的内存和处理资源越来越多。很快我们就确定自己需要将应用程序部署到集群环境中来应对日益增加的资源需求。然后就会认识到,要让 HttpSession 在集群环境中工作,每个对象都必须实现 Java Serializable 接口,以使会话数据能够在集群环境中的服务器间传递。然后必须确定应用服务器在关机/重启过程中是否要继续维护会话数据。问题变得越来越严重,很多专家都在预言:如果照这样发展下去,不断聚集的WEB应用迟早会压垮Internet 基础设施所能承担的容量,从而导致突然的崩塌。

以上所说的WEB应用架构存在两个主要问题:第一,服务器端不是无状态的,从而大大降低了系统的可见性、可靠性和可伸缩性;第二,无法(或很难)实现缓存,对于客户端重复的请求,服务器端都必须重新处理,这样既影响客户端的响应速度,又大大增加了服务端的负载。而这两个问题,在REST中是不存在的,这也许就是RESTWEB应用的价值所在。

 

2.2  RESTWEB中的应用

现在,已经有很多产品都声称自己是符合REST架构的,并提供相应的客户端API,例如Google Map等。虽然各家的实现方法是不一样的,但是一些基本的应用原则是统一的:

·        面像资源的(Resource-Oriented),一个WEB Service就是一个Resource

·        完全基于HTTP及其相关规范:

    • 服务器端和客户端是按HTTP协议进行信息传输的。
    • 每一个Resource都有一个唯一的标识URI
    • 对于所有的Resource,有且只有四种标准的HTTP操作:Put(创建),Get(读取),Post(更新),Delete(删除),例如:

[Get]http://www.sample.com/MyName 表示读取这个资源;

[Delete]http://www.sample.com/MyName 表示删除这个资源;

    • 服务器端和客户端传输的数据类型是根据HTTP Header定义的MIME类型确定的。
    • 总之,一句话,所有的东西都和HTTP相关。

·        基于RESTWEB Service的设计准则

    • 最关键的一点是:仔细思考哪些Resource是需要暴露成WEB Service的。
    • 给每一个Resource分配一个URI。注意,Resource应该是名词而不是动词。例如:

                            http://www.parts-depot.com/parts/getPart?id=00345

      

http://www.parts-depot.com/parts/00345

显然,第一个URI最后的“getPart”是一个动词,这是不应该出现的。而第二个URI显然要合理些。

    • Resource分成两类:只读的和可写的。对于只读的Resource,只能通过HTTP Get来访问;而对于可写的Resource,则除了HTTP Get以外,还可以通过HTTP POSTHTTP PUT HTTP DELETE来访问。
    • 服务器端在处理HTTP GET请求时,应该保证其对应的Resource是不被更改的。
    • 任何Resource都不应该是孤立存在的,应该把Resource通过超链接(hyperlink)联系起来,也就是说当用户通过URI访问某个Resource时,服务器端返回的结果(也就是这个ResourceRepresentation)应该包括与当前Resource相关的其他Resource的链接。例如:我们访问一本名叫《DesignPattern》的书,如下:

                    [Get]http://www.book-store/archive/DesignPattern

服务器返回的结果里就可以会包括作者(也是一个Resource)的一个超链接:

http://www.book-store/author/GOF4

    • 不要把所有的信息放在一个Resource里,注意层级结构,让用户通过Resource之间的链接来获取更详细的信息。
    • 应该建立客户端和服务器端之间的数据交换信息的格式标准,例如用Schema定义XML文档的格式等。
    • WSDL文件或HTML文件中清除的描述如何使用系统定义的Services
原创粉丝点击