摘要:REST——表征状态转移,因为REST模式的Web服务更加简洁,愈来愈多的Web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。php
本文咱们将讨论REST,它定义了一组体系架构原则,您能够根据这些原则设计以系统资源为中心的Web服务,这是一个很是容易让人误解的概念。本文主要是写给那些想设计WebService API但却对REST没有十分清晰认识的开发者们。在本文最后会附上一些资源供你们学习,这些资源讲解很是详细。html
什么是REST?git
表征状态转移(Representional State Transfer),是Roy Fielding( HTTP规范的主要编写者之一)博士在2000年他的博士论文中提出来的一种软件架构风格。它并非一个标准,而是经过表征(Representional )来描述传输状态的一种原则。其宗旨是从资源的角度来观察整个网络,分布在各处的资源由URI肯定,而客户端的应用经过URI来获取资源的表征。得到这些表征导致这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。github
目前在三种主流的Web服务实现方案中,由于REST模式的Web服务与复杂的SOAP和XML-RPC相对比,更加简洁,愈来愈多的Web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。web
让咱们来思考一下:spring
Marcus是一个农民,他有4头牛,12只鸡和3头奶牛。他如今模拟一个REST API,而我是客户端。若是我想用REST来请求当前的农场状态,我仅会问:“State?”Marcus会回答:“4头猪、12只鸡、3头奶牛”。json
这是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