`

(转)REST介绍

    博客分类:
  • SOA
阅读更多

原文地址:http://brainstorm.iteye.com/blog/119963

REST介绍

     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应用。

分享到:
评论
2 楼 zjc198805 2012-04-26  
lz,用rest上传文件怎么实现啊?644952013@qq.com
1 楼 dragon0361 2007-10-19  
非常不错啊

相关推荐

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

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

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

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

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

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

    python调用百度REST API实现语音识别

    下面我介绍以下如何使用Python调用百度的REST API实现一个简单的语音识别。 注册账号,并成为开发者 打开 http://yuyin.baidu.com/ ,并且使用你的百度账号登陆,如果你不是开发者,系统会自动引导你申请成为开发者...

    java外卖系统源码-ranker:带有使用.NET5用C#编写的示例项目的RESTAPI指南

    介绍 REST(REpresentational State Transfer)是一种架构风格,由在他的博士论文“”中。 根据菲尔丁的说法, “具象状态转移”这个名称旨在唤起一个精心设计的 Web 应用程序的行为方式:网页网络(虚拟状态机),...

    cognitive-services-REST-api-samples:这是4种语言的认知服务REST API示例的回购

    page_type 语言 产品 描述 urlFragment 样本 尖锐的 ... Java javascript ...此存储库提供了认知服务API的代码示例。...如果尚未创建所需的Azure服务,请转到此处获取免费(或付费)帐户: 使用代码示

    WSO2-ESB、WSO2 Enterprise Integrator 6.6.0 使用手册.doc

    最新WSO2 Enterprise Integrator6.6.0 使用手册,WSO2 ESB++ 企业集成。 包括rest代理和路由转发、rest转webservie服务,webservice服务转rest,tcp转webservice服务 WSO2三款产品介绍等

    doc-apirest-postman:Docs ApiRest邮递员

    邮差Payku API集合介绍。 在Payku,我们现在为您提供Postman中的集合,使您可以浏览器中的扩展程序或系统中的应用程序进行操作,以便快速,轻松地使用我们的REST API,非常适合开发人员和用户使用。 以同样的方式,...

    vulcain:快速且惯用的客户端驱动的REST API

    Vulcain是一种全新的协议,使用HTTP / 2 Server Push来创建快速且惯用的客户端驱动的REST API。...介绍 多年来,已经创建了多种格式来解决影响Web API的性能瓶颈:, ... 是针对HTTP / 1的智能。 但是,当涉及到

    api:Beaconstac REST API文档

    Beaconstac REST API文档 介绍 Beaconstac API围绕组织。 我们的API具有可预测的面向资源的URL,接受请求正文,返回响应,并使用标准的HTTP响应代码,身份验证和动词。 验证 Beaconstac API使用API​​密钥对请求...

    laravel-api-response-builder:构建美观,标准化且易于使用的Laravel REST API JSON响应

    介绍 ResponseBuilder是一个软件包,旨在帮助您构建一个美观,规范化且易于使用的REST API JSON响应。 好处 ResponseBuilder是由REST API开发人员为REST API开发人员编写的,并且基于API两面的长期经验。 它是轻量级...

    quicklook-rest-with-nim:用于 ReST (ReStructuredText) 文件的 QuickLook 渲染插件

    现在我已经介绍了每个人,这个项目是所有这些的融合,以提供一个在 Nim 中实现的 reST QuickLook 查看器。 还有一些替代的 python 实现,比如 ,它以某种方式从。 但是我不喜欢 python 版本有两个原因: Python ...

    详解从Django Rest Framework响应中删除空字段

    主要介绍了详解从Django Rest Framework响应中删除空字段,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    api-rest-java:使用 ForceManager rest API 的 Java 示例代码

    介绍 这是使用 RESTful API 的 Java 示例代码。 单击查看 API 文档。 此示例是使用 、 和用 Java 编写的。 入门 请按照以下步骤开始: 步骤 1:为 Java 配置 Eclipse IDE 您需要下载Java EE Developers的Eclipse ...

    net-api:记录在案的REST API,可从网络设备返回结构化数据

    介绍 net-api是有据可查的REST API平台,可从网络设备返回结构化数据。 此应用程序混合了各种技术,并且经过开发以突出显示多个开源项目可能实现的功能。 目录 net-api概述 下图显示了net-api的概述: 如图所示,...

    sphinx_asciidoc:Sphinx的AsciiDoc Builder和Writer

    Sphinx的AsciiDoc Builder和Writer(asciidoc)介绍Sphinx用于使用Docutils从reST源文件构建文档。 尽管有许多Sphinx输出编写器,例如html,ePub和LaTex,但没有可用的转换工具将基于Sphinx的reST文档转换为asciidoc...

    物联网通讯协议

    物联网的各种通讯协议介绍,包含MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP等协议。

    ribbon.zip

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

    pandalytic-backend:使用节点js启动REST API代码的样板

    介绍该项目是Pandalytic Technology Pvt的后端模板。 Ltd. CMS,一种内容管理系统。 这是Node.js中CMS的实现。设置确保完全按照以下说明执行所有这些步骤。 不要错过任何步骤,否则您将无法运行此应用程序。安装...

Global site tag (gtag.js) - Google Analytics