`
zhoushijun
  • 浏览: 270942 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

理解RESTful架构——资源、表现、转换

阅读更多
越来越多的人开始意识到,网站即软件,而且是一种新型的软件。

  这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。

  网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。



  RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

  但是,到底什么是RESTful架构,并不是一个容易说清楚的问题。下面,我就谈谈我理解的RESTful架构。

  一、起源

  REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

  Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主-席。所以,他的这篇论文一经发表,就引起了关注,并且立即对互联网开发产生了深远的影响。

  他这样介绍论文的写作目的:

    "本文研究计算机科学两大前沿----软件和网络----的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设 计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互 动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"

 二、名称

  Fielding将他对互联网软件的架构原则,定名为REST,即Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

  如果一个架构符合REST原则,就称它为RESTful架构。

  要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组到底是什么意思,它的每一个词代表了什么涵义。如果你把这个名称搞懂了,也就不难体会REST是一种什么样的设计。

  三、资源(Resources)

  REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。

  所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实体。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

  所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。

  四、表现层(Representation)

  "资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。

  比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。

   URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而 URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是 对"表现层"的描述。

  五、状态转化(State Transfer)

  访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

  互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

  客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

  六、综述

  综合上面的解释,我们总结一下什么是RESTful架构:

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层(Representation);

  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

  七、误区

  RESTful架构有一些典型的设计误区。

  最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。

  举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

  如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

      POST /accounts/1/transfer/500/to/2

  正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

      POST /transaction HTTP/1.1
      Host: 127.0.0.1
      
      from=1&to=2&amount=500.00

  另一个设计误区,就是在URI中加入版本号:

      http://www.example.com/app/1.0/foo

      http://www.example.com/app/1.1/foo

      http://www.example.com/app/2.0/foo

  因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services):

      Accept: vnd.example-com.foo+json; version=1.0

      Accept: vnd.example-com.foo+json; version=1.1

      Accept: vnd.example-com.foo+json; version=2.0
分享到:
评论

相关推荐

    restful——webservice

    总结来说,这个例子展示了如何利用Restlet框架构建RESTful Web服务,包括URL映射、数据库访问、资源操作和数据转换。尽管Restlet提供了许多优点,但为了提高系统性能和安全性,还可以考虑进一步集成Spring框架、优化...

    构建微服务云原生应用——系统架构设计和技术栈选型.pdf

    当单体应用复杂到一定程度,难以理解和维护时,就需要考虑将它拆分为微服务架构。这个转换并不是一蹴而就的,需要有策略地进行微服务化,这在Martin Fowler的《MonolithFirst》和《MicroservicePremium》中有详细...

    领域驱动设计实践——架构风格及架构实例

    2. **REST架构** - RESTful设计强调资源的表述和状态转换,通过HTTP协议的GET、PUT、POST和DELETE等方法操作资源。在DDD中,可以将实体、值对象或领域服务作为资源,通过REST服务提供服务。 3. **CQRS(命令查询...

    Laravel开发-laravel-restful-helper

    在本文中,我们将深入探讨Laravel开发中的一个重要概念——RESTful API设计,以及"Laravel Restful Helper"在其中的作用。Laravel是一个优雅且强大的PHP框架,它为开发人员提供了丰富的工具来构建高质量的Web应用...

    CMPE273-Lab-2:cmpe 273 实验 2——REST API 到 gRPC API 的转换

    在本实验"CMPE273-Lab-2: REST API 到 gRPC API 的转换"中,我们将探讨如何从传统的基于HTTP的RESTful应用程序接口转换到使用gRPC的高性能、类型安全的协议缓冲区(protobuf)接口。gRPC是一个开源的RPC(远程过程...

    Android源码——云端发音字典源码.zip

    在Android平台上,开发一款应用,特别是涉及到语音合成与发音功能时,往往需要深入理解系统架构以及相关技术。"Android源码——云端发音字典源码.zip"提供的内容可能包括一个完整的Android应用程序源代码,该程序...

    cxf转换器

    【标题】"CXF转换器"涉及的是Apache CXF框架在Web服务开发中的应用,特别是其转换器功能和Web服务发布的实现。 Apache CXF是一个开源的...在实际工作中,深入理解这些知识点对于构建高效、健壮的Web服务架构至关重要。

    实战Web Service —— 使用Apache CXF开发Web服务的教程

    **实战Web Service —— 使用Apache CXF开发Web服务的教程** Apache CXF是一个开源的Java框架,用于构建和部署Web服务。本教程将带你深入理解如何利用CXF来开发高效、灵活的Web服务。我们将从基础概念开始,逐步...

    axis2学习——客户端的开发

    在IT行业中,Axis2是Apache组织提供的一款强大的Web服务框架,专门用于构建和部署SOAP(简单对象访问协议)和RESTful服务。这篇博客"axis2学习——客户端的开发"主要探讨了如何使用Axis2来创建和操作Web服务的客户端...

    用web 服务编的进制转换器。

    1. **设计接口**:定义Web服务接口,例如使用RESTful风格,创建如下的资源路径: - `/convert/binary-to-decimal` - `/convert/decimal-to-binary` - `/convert/octet-to-decimal` - `/convert/decimal-to-octet...

    Spring mvc实现Restful返回xml格式数据实例详解

    Spring MVC是Spring框架的一个模块,它提供了一个全面的编程和配置模型用于现代基于Web的应用程序——从简单的到全面的。一个关键特性是:与Spring框架的其他部分的轻松集成,以及RESTful应用程序的开发。Restful是...

    JerseyDemo

    1. RESTful架构风格:REST强调通过URI(统一资源标识符)定位资源,使用标准HTTP方法(如GET、POST、PUT、DELETE)进行操作。这种设计方式使得Web服务易于理解和使用,且具有良好的可扩展性。 2. Jersey框架:...

    Laravel开发-rest

    对于资源集合和单个资源,Laravel提供了`Collection`和`Model`类的`toArray()`和`toJson()`方法,帮助我们转换数据到合适的格式。使用` fractal`库或`laravel-eloquent-json-api`可以进一步优化输出,使其更符合...

    Delphi XE7开发入门教程之DataSnap三层架构篇-第一部分

    1. **三层架构**:三层架构是一种软件设计模式,将应用分为表现层(用户界面)、业务逻辑层(处理业务规则)和数据访问层(与数据库交互)。这种分离有助于提高代码的可维护性和可重用性。 2. **Delphi XE7**:这是...

    机器翻译——tf框架

    机器翻译通过利用计算机算法和大数据,自动将文本从一种语言转换为另一种语言,极大地提高了翻译效率。本文将深入探讨机器翻译的核心原理,并以TensorFlow这一强大的深度学习框架为基础,讲解如何在自建服务器环境中...

    前后端分离仿电商项目,我们的原则是——潮-dmall.zip

    【标题】:“前后端分离仿电商项目,我们的原则是——潮-dmall.zip”指出这是一个基于前后端分离架构的电子商务项目,旨在模拟真实的电商平台功能。"潮-dmall"可能代表项目具有创新、潮流的特点,意在提供一个现代且...

    Hands-On-Restful-Web-services-with-Go:Go by Packt Publishing的动手式宁静Web服务

    《动手式RESTful Web服务——Go语言实现》是由Packt Publishing出版的一本专注于Go语言开发RESTful Web服务的实践教程。这本书旨在帮助开发者熟练掌握利用Go语言构建高效、可扩展的网络服务。RESTful Web服务是一种...

    ASP.NET源码——获取MSN,Live,google,Yahoo 好友列表.zip

    开发者需要理解RESTful API的工作原理,以及如何正确构造和发送请求。 6. **数据解析和展示**: 获取到好友列表后,开发者可能使用了.NET Framework的XML或JSON解析库,如System.Xml.Linq (XDocument) 或 ...

    亲测好用——Apache Camel简介以及使用场景.pptx.zip

    - **微服务集成**:在微服务架构中,Camel 可作为服务间的通信桥梁,处理跨服务的数据传输。 - **文件系统监控**:可以设置监控特定目录,当有新文件出现时自动处理。 - **消息队列集成**:与消息中间件如 ...

    ASP.NET源码——PDF阅读器源码.zip

    此“ASP.NET源码——PDF阅读器源码.zip”压缩包提供了一个用于在线查看PDF文档的ASP.NET应用程序的源代码。以下是对这个源码包中可能包含的关键知识点的详细解释: 1. **ASP.NET MVC或Web Forms**: - PDF阅读器...

Global site tag (gtag.js) - Google Analytics