`
tenn
  • 浏览: 572335 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论
阅读更多
REST架构风格是全新的针对Web应用的开发风格,是当今世界最成功的互联网超媒体分布式系统架构,它使得人们真正理解了Http协议本来面貌。随着REST架构成为主流技术,一种全新的互联网网络应用开发的思维方式开始流行。

 

     REST是什么

     REST是英文Representational State Transfer的缩写,中文翻译为“表述性状态转移”,他是由Roy Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。

     基于Web的架构,实际上就是各种规范的集合,这些规范共同组成了Web架构。比如Http协议,比如客户端服务器模式,这些都是规范。每当我们在原有规范的基础上增加新的规范,就会形成新的架构。而REST正是这样一种架构,他结合了一系列的规范,而形成了一种新的基于Web的架构风格。

     传统的Web应用大都是B/S架构,它包括了如下一些规范 。

     客户-服务器

  • 这种规范的提出,改善了用户接口跨多个平台的可移植性,并且通过简化服务器组件,改善了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成为了可能。

     无状态性

  • 无状态性是在客户-服务器约束的基础上添加的又一层规范。他要求通信必须在本质上是无状态的,即从客户到服务器的每个request都必须包含理解该request所必须的所有信息。这个规范改善了系统的可见性(无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前request,而不必了解所有的request历史),可靠性(无状态性减少了服务器从局部错误中恢复的任务量),可伸缩性(无状态性使得服务器端可以很容易的释放资源,因为服务器端不必在多个request中保存状态)。同时,这种规范的缺点也是显而易见得,由于不能将状态数据保存在服务器上的共享上下文中,因此增加了在一系列request中发送重复数据的开销,严重的降低了效率。

     缓存

  • 为了改善无状态性带来的网络的低效性,我们填加了缓存约束。缓存约束允许隐式或显式地标记一个response中的数据,这样就赋予了客户端缓存response数据的功能,这样就可以为以后的request共用缓存的数据,部分或全部的消除一部分交互,增加了网络的效率。但是用于客户端缓存了信息,也就同时增加了客户端与服务器数据不一致的可能,从而降低了可靠性。

     B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改善这种情况,我们引入了REST。

     REST在原有的架构上增加了三个新规范:统一接口,分层系统和按需代码。

     统一接口

  • REST架构风格的核心特征就是强调组件之间有一个统一的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用的链接器接口对资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性。并且REST针对Web的常见情况做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就导致了REST接口对其它的架构并不是最优的。

     分层系统

  • 分层系统规则的加入提高了各种层次之间的独立性,为整个系统的复杂性设置了边界,通过封装遗留的服务,使新的服务器免受遗留客户端的影响,这也就提高了系统的可伸缩性。

     按需代码

  • REST允许对客户端功能进行扩展。比如,通过下载并执行applet或脚本形式的代码,来扩展客户端功能。但这在改善系统可扩展性的同时,也降低了可见性。所以它只是REST的一个可选的约束。

 

     REST的设计准则

     REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则:

    1. 网络上的所有事物都被抽象为资源(resource);
    2. 每个资源对应一个唯一的资源标识符(resource identifier);
    3. 通过通用的连接器接口(generic connector interface)对资源进行操作;
    4. 对资源的各种操作不会改变资源标识符;
    5. 所有的操作都是无状态的(stateless)。

     REST中的资源所指的不是数据,而是数据和表现形式的组合,比如“最新访问的10位会员”和“最活跃的10为会员”在数据上可能有重叠或者完全相同,而由于他们的表现形式不同,所以被归为不同的资源,这也就是为什么REST的全名是Representational State Transfer的原因。资源标识符就是URI(Uniform Resource Identifier),不管是图片,Word还是视频文件,甚至只是一种虚拟的服务,也不管你是xml格式,txt文件格式还是其它文件格式,全部通过URI对资源进行唯一的标识。

     REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。以往的Web开发大多数用的都是Http协议中的GET和POST方法,对其他方法很少使用,这实际上是因为对Http协议认识片面的理解造成的。Http不仅仅是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。他不仅仅能对互联网资源进行唯一定位,而且还能告诉我们如何对该资源进行操作。Http把对一个资源的操作限制在4个方法以内:GET,POST,PUT和DELETE,这正是对资源CRUD操作的实现。由于资源和URI是一一对应的,执行这些操作的时候URI是没有变化的,这和以往的Web开发有很大的区别。正由于这一点,极大的简化了Web开发,也使得URI可以被设计成更为直观的反映资源的结构,这种URI的设计被称作RESTful的URI。这位开发人员引入了一种新的思维方式:通过URL来设计系统结构。当然了,这种设计方式对一些特定情况也是不适用的,也就是说不是所有的URI都可以RESTful的。

     REST之所以可以提高系统的可伸缩性,就是因为它要求所有的操作都是无状态的。由于没有了上下文(Context)的约束,做分布式和集群的时候就更为简单,也可以让系统更为有效的利用缓冲池(Pool)。并且由于服务器端不需要记录客户端的一系列访问,也减少了服务器端的性能。

     

    使用REST架构

    对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。在REST中,所有的URL都对应着资源,只要URL的设计是良好的,那么其呈现的系统结构也就是良好的。这点和TDD(Test Driven Development)很相似,他是通过测试用例来设计系统的接口,每一个测试用例都表示一系列用户的需求。开发人员不需要一开始就编写功能,而只需要把需要实现的功能通过测试用例的形式表现出来即可。这个和REST中通过URL设计系统结构的方式类似,我们只需要根据需求设计出合理地URL,这些URL不一定非要链接到指定的页面或者完成一些行为,只要它们能够直观的表现出系统的用户接口。根据这些URL,我们就可以方便的设计系统结构。从REST架构的概念上来看,所有能够被抽象成资源的东西都可以被指定为一个URL,而开发人员所需要做的工作就是如何能把用户需求抽象为资源,以及如何抽象的精确。因为对资源抽象的越为精确,对REST的应用来说就越好。这个和传统MVC开发模式中基于Action的思想差别就非常大。设计良好的URL,不但对于开发人员来说可以更明确的认识系统结构,对使用者来说也方便记忆和识别资源,因为URL足够简单和有意义。按照以往的设计模式,很多URL后面都是一堆参数,对于使用者来说也是很不方便的。

    既然REST这么好用,那么是不是所有的Web应用都能采取此种架构呢?答案是否定的。我们知道,直到现在为止,MVC(Model-View-Controller)模式依然是Web开发最普遍的模式,绝大多数的公司和开发人员都采取此种架构来开发Web应用,并且其思维方式也停留于此。MVC模式由数据,视图和控制器构成,通过事件(Event)触发Controller来改变Model和View。加上Webwork,Struts等开源框架的加入,MVC开发模式已经相当成熟,其思想根本就是基于Action来驱动。从开发人员角度上来说,贸然接受一个新的架构会带来风险,其中的不确定因素太多。并且REST新的思维方式是把所有用户需求抽象为资源,这在实际开发中是比较难做到的,因为并不是所有的用户需求都能被抽象为资源,这样也就是说不是整个系统的结构都能通过REST的来表现。所以在开发中,我们需要根据以上2点来在REST和MVC中做出选择。我们认为比较好的办法是混用REST和MVC,因为这适合绝大多数的Web应用开发,开发人员只需要对比较容易能够抽象为资源的用户需求采取REST的开发模式,而对其它需求采取MVC开发即可。这里需要提到的就是ROR(Ruby on Rails)框架,这是一个基于Ruby语言的越来越流行的Web开发框架,它极大的提高了Web开发的速度。更为重要的是,ROR(从1.2版本起)框架是第一个引入REST做为核心思想的Web开发框架,它提供了对REST最好的支持,也是当今最成功的应用REST的Web开发框架。实际上,ROR的REST实现就是REST和MVC混用,开发人员采用ROR框架,可以更快更好的构建Web应用。

 

    对开发人员来说,REST不仅仅在Web开发上贡献了自己的力量,同时也让我们学到了如何把软件工程原则系统地应用于对一个真实软件的设计和评估上。

分享到:
评论
1 楼 tenn 2007-11-21  
此文为他人原创,居然和rest_百度百科描述的大同小异。

相关推荐

    soap_to_rest_node:将SOAP转换为REST请求的项目

    6. `README.md`:项目介绍、安装和使用指南,通常遵循Markdown格式。 7. `LICENSE`:项目使用的开源许可证,定义了其他人使用、修改和分发代码的条件。 总的来说,"soap_to_rest_node"项目提供了一种工具,让开发者...

    Django-REST-framework教程中文版

    本教程基于Django1.9以及restframework-v3.3.3版本,着重介绍了序列化、请求和响应处理、类视图、认证和权限、关联关系及超链接处理以及ViewSets和Routers的使用。 首先,在快速入门章节中,教程引导我们如何搭建一...

    REST Server in Delphi XE Using DataSnap中文版

    此外,文章还介绍了如何利用 JSON 进行数据交换,以及如何开发与 REST 服务器交互的基于浏览器的应用程序。这些技能在现代 Web 开发中至关重要,对于想要在该领域有所成就的开发者来说是不可或缺的知识。

    使用 sqlRest 将数据库转换为 REST 风格的 Web 服务

    本文介绍 sqlRest 框架,它是一种高效的轻量级数据库 REST 服务解决方案,您可以通过简单的配置直接将数据库中的数据暴露成 REST 风格的 Web 服务,并将数据库的 CRUD 操作和 REST 服务的 GET, DELETE, POST, PUT...

    Rest所需jar文件

    下面将详细介绍REST架构的核心概念以及这些jar文件在其中的作用。 1. **URI(统一资源标识符)**:REST中的每个操作都通过一个唯一的URI(Uniform Resource Identifier)来标识。URI是资源的地址,通过HTTP方法...

    RESTier, 构建rest式服务的一个转向.zip

    RESTier, 构建rest式服务的一个转向 RESTier 1.介绍OData支持开放数据协议。 它是由微软发起的,现在是ISO和OASIS标准。 使用简单HTTP请求,可以以创建和使用 RESTful api,使资源在数据模型中定义,并使用url进行...

    Delphi REST 服务器返回UTF16编码转换成正常string示例.rar

    下面将详细介绍这个过程。 1. **理解UTF16编码**: UTF16是一种变长的Unicode编码,每个字符可以由一个或两个16位的字节表示。对于大多数ASCII字符(西欧字符),UTF16使用单个字节,而对于其他Unicode字符,如...

    cxf开发rest风格接口jar

    本指南将详细介绍如何使用CXF来开发REST风格的接口,并列出开发过程中所需的最小JAR包。 【描述】"使用CXF开发REST接口时,我们关注的是最小化依赖,以降低项目复杂性和提升效率。这些最小化的JAR包包括了CXF的核心...

    ArcGIS Server REST基础教程

    本教程将详细介绍ArcGIS Server REST接口的基础知识和应用。 **1. REST API概述** REST是一种网络应用程序的设计风格和开发方式,基于HTTP协议,提供了创建、读取、更新和删除(CRUD)资源的操作。ArcGIS Server ...

    dubbo提供 rest 服务接口

    本文将详细介绍如何利用 Dubbo 实现 REST 服务接口。 ### 1. RESTful API 基础 REST 是一种软件架构风格,用于设计网络应用程序。它的核心理念是资源的表示和状态转换。RESTful API 通常使用 HTTP 协议,通过 GET、...

    关于rest接口demo的详解

    本节主要介绍了 MetaOne 平台 Webservice 接口第 I 条元数据服务接口规范要求元数据管理模块需要采用数据封装的机制对外提供一系列查询和操作的服务接口,将元数据信息和操作封装为标准化元数据服务,供本模块内部和...

    django-rest-framework-tutorial(中文版)

    Django Rest Framework(DRF)是Python编程语言的一个强大的、灵活的工具,用于构建Web API。本教程旨在为读者提供一个中文翻译版的详细指南,帮助他们理解DRF的主要组件和它们是如何协同工作的。教程分为六个部分,...

    Apache CXF + Spring3 + REST + JSON配置

    以上是关于"Apache CXF + Spring3 + REST + JSON配置"的基本介绍,实际应用中可能涉及更多的细节和高级特性,如错误处理、分页、过滤器、拦截器等。在具体实践中,应结合项目需求灵活运用这些技术,以构建高效、可靠...

    Finn之 SpringCloud2.0教程全集(三)- 服务消费者(rest + ribbon)

    通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,...

    Django REST framework 中文文档.pdf

    Django REST framework(DRF)是建立在Django Web框架之上的一款强大的、灵活的并且能够处理Web API的工具集。DRF为开发者提供了一套快速构建RESTful API的解决方案,它不仅能够帮助开发者避免重复的代码编写,还...

    Django REST framework框架手册

    下面将详细介绍DRF的核心概念和功能。 ### 1. **入门** DRF的入门涉及安装、配置和创建第一个API。首先,通过`pip install djangorestframework`来安装库,然后在项目的`settings.py`中添加`'rest_framework'`到`...

Global site tag (gtag.js) - Google Analytics