为啥REST如此重要?

标签: rest | 发表时间:2013-08-06 11:45 | 作者:
出处:http://kb.cnblogs.com/

  英文原文: Why REST is so important

  本文我们将讨论 REST,它定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,这是一个非常容易让人误解的概念。本文主要是写给那些想设计 WebService API 但却对 REST 没有十分清晰认识的开发者们。在本文最后会附上一些资源供大家学习,这些资源讲解非常详细。

   什么是 REST

  表征状态转移(Representional State Transfer),是 Roy Fielding( HTTP 规范的主要编写者之一)博士在 2000 年他的博士论文中提出来的一种软件架构风格。它并不是一个标准,而是通过表征(Representional )来描述传输状态的一种原则。其宗旨是从资源的角度来观察整个网络,分布在各处的资源由 URI 确定,而客户端的应用通过 URI 来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。

  目前在三种主流的 Web 服务实现方案中,因为 REST 模式的 Web 服务与复杂的 SOAP 和 XML-RPC 相对比,更加简洁,越来越多的 Web 服务开始采用 REST 风格设计和实现。例如,Amazon.com 提供接近 REST 风格的 Web 服务进行图书查找;雅虎提供的 Web 服务也是 REST 风格的。

  让我们来思考一下:

  Marcus 是一个农民,他有 4 头牛,12 只鸡和 3 头奶牛。他现在模拟一个 REST API,而我是客户端。如果我想用 REST 来请求当前的农场状态,我仅会问:“State?”Marcus 会回答:“4 头猪、12 只鸡、3 头奶牛”。

  这是 REST 最简单的一个例子。Marcus 使用表征来传输农场状态。表征的句子很简单:“4 头猪、12 只鸡、3 头奶牛”。

  再往下看,看我如何让 Marcus 用 REST 方式添加 2 头奶牛?

  按照常理,可以会这样说:Marcus,请在农场你再添加 2 头奶牛。难道这就是 REST 方式吗?难道就是通过这样的表征来传输状态的吗?不是的!这是一个远程过程调用,过程是给农场添加 2 头奶牛。

  Marcus 很愤怒地响应到:“400,Bad Request”,你到底是什么意思?

  所以,让我们重新来一次。我们怎样做到 REST 方式呢?该怎样重新表征呢?它应该是 4 头猪、12 只鸡、3 头奶牛。好,让我们再次重新表征……

  我:“Marcus,……4 头猪、12 只鸡、 5 奶牛!”

  Marcus:“好的”。

  我:“Marcus,现在是什么状态?”

  Marcus:“4 头猪、12 只鸡、5 头奶牛”。

  我:“好!”

  看到了吗?就这样简单。

   为什么 RPC 也不够好?

  从逻辑角度来看,为什么会更加青睐 REST 而不是 RPC(Remote Procedure Call,远程过程调用 ),因为它极大的降低了我们沟通的复杂度,通过把表征作为唯一的沟通的方式。无需去讨论过程(添加一头牛?增加一种动物类型?给鸡的数量翻倍还是卖掉所有猪?)我们只需讨论表征,并且使用这个表征来达到我们想要的目标,很简单,不是吗?我不希望和 Marcus 的沟通失败,因为我们彼此的理解过程会不一样,所以只需要知道最后的状态就行。但这仅仅是创建 RPC 会产生许多问题之一。如果你使用 RPC,你需要设计一些程序嵌入到某种结构中。这种结构需要存储参数、错误的代码、返回值等。我已经看到许多公司这样做,他们设计自己的 RPC-结构来实现客户端与服务器端的交互,但却产生许多问题。你为什么要这么做?为什么要创建自己的 RPC-结构?这样做的好处是?倘若我想要让应用程序使用许多 WebService,并且这些 WebService 带有多个 RPC-格式属性?那么我不得不去开发一些类似这样的东西:

  如果你们真的需要 RPC,至少要选择一个类似 SOAP 的标准。

   但 SOAP 也很糟糕

  即使 RPC 的标准真的很令人痛苦,但我不得不承认 ACID 事务,一个完整的标准化服务描述性语言 SOAP(Simple Object Access Protocol,简单对象访问协议)在某些环境下表现的还不错。尽管如此,SOAP 产品的性能开销很大,它是一个巨大的性能杀手。虽然 REST 不是一个标准,但在实现 RESTful Web 服务时可以使用其他各种标准(比如 HTTP、URL、XML、PNG 等)。

   Session 更邪恶

  你无需 Session!但有人会说:“我想要保存用户购物车里的商品,所以我必须要 Session!”不,这样想是错误的!即使没有 Session,你也可以做你任何你想做的事情。你可以只需在 URL 里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/5235”。

  不需要与客户端进行会话,通过这些操作(指在 URL 里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/5235”)后,客户端向服务器发出请求后,哪怕你在服务器上执行卸载平台和操作系统、拆除服务器硬件、重新组装服务器、重新安装操作系统、平台、应用程序备份恢复操作,也不会影响客户端。

  不要强迫客户端保存状态,这样做不仅复杂,而且还会带来许多问题,你应该从你的 Web 应用程序里删除有状态的东西。

   不要重造超媒体

  目前,超媒体已经相当普及,我提醒大家,不要再去重新造轮子。这里已经有许多,足够你使用了:

   其他资源

  这里还有一些更加深入的资源供你参考使用:

  (编译:张红月,责编:王果)

  来自: Why REST is so important

相关 [rest] 推荐:

经典论文 — REST

- ripwu - kernelchina
牛人Roy Thomas Fielding的博士论文,此处可以访问到英文版,中文版可以google一下. HTTP1.0,1.1版本以及URI规范的主要作者,Apache的co-founder. 在写这篇论文之前已经很牛了,笔者不明白的是这种档次牛人还要读博士,文凭有这么重要吗. 文中没有任何令人眼花的数学公式和统计图表,实际上是一篇描述URI,HTTP设计经验教训总结的文章.

MongoDB REST Api介绍

- peigen - NoSQLFan
MongoDB默认会开启一个HTTP协议的端口提供REST的服务,这个端口是你Server端口加上1000,比如你的Server端口为27017,那么这个HTTP端口就是28017,默认的HTTP端口功能是有限的,你可以通过添加–rest参数启动更多功能. 下面是在这个端口通过其RESTFul 的API操作MongoDB数据的几个例子,来源是MongoDB官方文档.

WebSockets与REST之争?

- - 酷勤网-挖经验 [expanded by feedex.net]
WebSockets变得越来越流行并积累了不少用户. 去年年底,WebSockets成为了. W3C的推荐候选,这使得其向标准更迈进了一步. Oracle等其他厂商最近也提交了申请,来启动在Java企业版的下一个版本中引入WebSockets(. JSR 356)的标准流程工作. 绝大部分的主流浏览器,如Chrome、Firefox、Safari和IE,都支持某个WebSockets修正本,并最终会采用最后成形的标准.

REST 与 SOAP巅峰对话

- - CSDN博客互联网推荐文章
随着Restful的流行,soap似乎有点贵族落寞了. 下面我们先详细分析一下他们的各自的特点. REST(Representational State Transfer)是 Roy Fielding 提出的一个描述互联系统架构风格的名词. Web 本质上由各种各样的资源组成,资源由 URI 唯一标识.

为啥REST如此重要?

- - 博客园_知识库
  英文原文: Why REST is so important.   本文我们将讨论 REST,它定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,这是一个非常容易让人误解的概念. 本文主要是写给那些想设计 WebService API 但却对 REST 没有十分清晰认识的开发者们.

REST服务开发实战

- - 互联网 - ITeye博客
本文转自http://kb.cnblogs.com/page/91827/.   如果要说什么是REST的话,那最好先从Web(万维网)说起. 读者可以查看维基百科的词条( http://zh.wikipedia.org/zh-cn/Web),具体的我就不多说了. 总之,Web是我们在互联网上最常用的服务,甚至在某些人的心中,互联网就是Web.

REST API性能比较

- - Java - 编程语言 - ITeye博客
REST已然成为最流行的提供外界服务API的方式. 同时,随着互联网和物联网的普及,如今的应用需要处理大量并发的请求. 因此,开发高性能REST服务已经成为一个成功应用的必备条件. 我这里集中讨论Java和JVM相关技术. 基于Java的REST应用比基于python和ruby的应用往往具备更好的性能.

撰写合格的REST API

- - 博客园_知识库
  两周前因为公司一次裁人,好几个人的活都被按在了我头上,这其中的一大部分是一系列REST API,撰写者号称基本完成,我测试了一下,发现尽管从功能的角度来说,这些API实现了spec的显式要求,但是从实际使用的角度,欠缺的东西太多(各种各样的隐式需求). REST API是一个系统的backend和frontend(或者3rd party)打交道的通道,承前启后,有很多很多隐式需求,比如调用接口与RFC保持一致,API的内在和外在的安全性等等,并非提供几个endpoint,返回相应的json数据那么简单.

一些 REST 最佳实践

- - 鸟窝
原文: Some REST best practices, 作者: Pierre-Olivier Bourgeois. 译文: 一些REST最佳实践, 译者: yongx. 如今,REST APIs 已经非常普遍,几乎所有WEB应用都用到了它们. 提供简单,一致,实用的API是种义务,方便其它人很容易的使用.