为啥REST如此重要?

本文我们将讨论 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

译文原文:http://ju.outofmemory.cn/entry/40376

时间: 2024-12-27 15:58:38

为啥REST如此重要?的相关文章

js 小数计算为啥和想象中不一样!

今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? "0.3啊!"你可能都不会考虑.我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){...}.我可能等一下午都等不到大括号中的内容被执行. 为啥呢?因为在js中0.1+0.2=0.30000000000000004.说起来你可能不信,又或者去验证一下.结果为啥是这样?在我查找资料之后豁然开朗.对于浮点型数据,大多语言计算都会丢失精度.但是像c++/java这种厉害的语言都有自己封装的一套方法

OpenCV 为啥勾搭上 OpenGL

OpenCV 为啥勾搭上 OpenGL? Vinjn张静· 2 年前 如果读者留意 OpenCV 2.3 之后的版本,那么会发现 cv::ogl namespace,ogl 自然是 OpenGL了.一个三维计算机图形库为何出现在计算机视觉中,传统的 CV 开发者是否需要学习它,这些问题待我一一来回答. 问题一:为何引入 OpenGL? 在 2.3 之前 OpenCV 的渲染部分都是由 CPU 来实现的,不论是画线还是把图片显示到屏幕上.这有两个问题,速度慢,同时没法画三维物体.引入 OpenGL

PMP项目管理学习笔记前言——为啥要取得认证?

(一)为啥要取得认证? 如果你参与过很多项目,就会发现,你总是在周而复始地面对同样的一些问题.一些常见的问题目前已经有了通用解决方案.经过多年的实战,项目经理已们已经掌握了很多应验教训,而通过PMP(项目管理专业人士资格认证-Project Management Professional)考试则是将这些智慧结晶付诸实践的“入场卷”. (二)优秀的项目经理需要什么? 知识(knowledge)如果你关注项目管理领域的发展动态,可以从每个人的成功与失误中学习经验教训,从而能更好地完成你的工作. 绩效

为啥NSString的属性要用copy而不用retain

之前学习生活中,知道NSString的属性要用copy而不用retain,但是不知道为啥,这两天我研究了一下,然后终于明白了. 具体原因是因为用copy比用retain安全,当是NSString的时候,其实用copy和retain都行,当用NSMutableString,那么就要用copy,NSMutableString的值不会被修改,而用retain的时候,NSMutableString的值会被修改,具体情况,可以看下面的代码: #import <Foundation/Foundation.h

中国人摆脱地沟油为啥这么难?

在中国,地沟油一直是事关百姓健康的民生大问题,并且早已不是新鲜话题.长期以来,地沟油猖獗横行,屡禁不止,给人民身心健康和生命财产,造成了无可弥补的巨大损失. 我国的百姓虽然对此类产品恨得牙根直痒,却也无可奈何,近乎绝望.这也让百姓不解,这些丧尽天良的违法者之恶行,早已逾越了道德和法制的底线,他们为什么如此猖獗?难道真的没有公理了吗?长此以往,何以构建和谐社会? 我们经常能看到我们的媒体很愿意曝光别国的负面消息,但除了我国频现地沟油事件之外,别的国家的地沟油事件似乎没见诸见媒体.产生地沟油等有毒有

苹果为啥总和“医生”过不去?

生老病死是每个人都要经历的事情,生与死对于每个人都是公平的,正如人固有一死,或轻于鸿毛,或重于泰山,但衰老和疾病在不同人群中的表现却是大不相同的,有的小鲜肉天生逆生长,任岁月匆匆流去,他们也不会变老,甚至越活越年轻:疾病就更加大相径庭了,同样是脑出血,有些人的父亲因住院费不足,儿女都盼望着他早早死掉,以获得财务上的解脱,老人自然不会得到最佳的治疗,最终变得全身瘫痪.屎尿横流,悲惨地离开人世:有些人的父亲则因财务状况良好,充分享享受着特级待遇,不小心弄出来的血,亦能慢慢吸收,甚至回到健康状态,享受

为啥都不用Qt Quick Controls 2呢

为啥都不用Qt Quick Controls 2呢 https://github.com/qt/qtquickcontrols2/

为啥以下网页不能正常执行呢?

1.以下代码 a) </head></script>顺序写反了,导致不能认识到有script b)但还是执行不正常,为啥呢? A:这里创建了东西,但是没有添加进去! 1 <head> 2 <script type="text/javascript"> 3 4 function f() 5 { 6 var c=document.createElement('a'); 7 c.setAttribute("href",&qu

boost -- scoped_lock V.S. mutex的lock/unlock—— 为啥推荐使用scoped_lock

为啥推荐使用scoped_lock 和RAII idiom变流行是一样的原因:因为你可以确包任何情况下离开执行范围都会解锁mutex 注意,这不仅仅是说你可能忘记调用unlock():在你的mutex被锁定之后,还有可能抛出异常,你写的unlock调用语句有可能永远没有机会执行,即使在lock()和unlock()之间没有返回语句也一样. m.lock() // m 是一个 mutex // ... foo(); // 如果这函数里面throw up了, 你的mutex 就会永远锁住了 // .

java为啥计算时间从1970年1月1日开始

http://www.myexception.cn/program/1494616.html ---------------------------------------------------------- java为什么计算时间从1970年1月1日开始 今天在看Python  API 时,看到 time 模块 : The epoch is the point where the time starts. On January 1st of that year, at 0 hours,the