?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
本文我们讨?RESTQ它定义了一l体pL构原则,您可以根据这些原则设计以pȝ资源Z心的 Web 服务Q这是一个非常容易让解的概念。本文主要是写给那些惌?WebService API 但却?REST 没有十分清晰认识的开发者们。在本文最后会附上一些资源供大家学习Q这些资源讲解非常详l?/p>
什么是RESTQ?/strong>
表征状态{U(Representional State TransferQ,?Roy FieldingQ?HTTP 规范的主要编写者之一Q博士在 2000 q他的博士论文中提出来的一UY件架构风根{它q不是一个标准,而是通过表征QRepresentional Q来描述传输状态的一U原则。其宗旨是从资源的角度来观察整个|络Q分布在各处的资源由 URI 定Q而客L的应用通过 URI 来获取资源的表征。获得这些表征致使这些应用程序{变了其状态。随着不断获取资源的表征,客户端应用不断地在{变着其状态?/p>
目前在三U主的 Web 服务实现Ҏ中,因ؓ REST 模式?Web 服务与复杂的 SOAP ?XML-RPC 相对比,更加z,来多?Web 服务开始采?REST 风格设计和实现。例如,Amazon.com 提供接近 REST 风格?Web 服务q行图书查找Q雅虎提供的 Web 服务也是 REST 风格的?/p>
让我们来思考一下:
Marcus 是一个农民,他有 4 头牛Q?2 只鸡?3 头奶牛。他现在模拟一?REST APIQ而我是客L。如果我想用 REST 来请求当前的农场状态,我仅会问Q“StateQ”Marcus 会回{:? 头猪?2 只鸡? 头奶牛”?/p>
q是 REST 最单的一个例子。Marcus 使用表征来传输农场状态。表征的句子很简单:? 头猪?2 只鸡? 头奶牛”?/p>
再往下看Q看我如何让 Marcus ?REST 方式d 2 头奶牛?
按照常理Q可以会q样_MarcusQ请在农Z再添?2 头奶牛。难道这是 REST 方式吗?N是通过q样的表征来传输状态的吗?不是的!q是一个远E过E调用,q程是给农场d 2 头奶牛?/p>
Marcus 很愤怒地响应刎ͼ?00QBad Request”,你到底是什么意思?
所以,让我们重新来一ơ。我们怎样做到 REST 方式呢?该怎样重新表征呢?它应该是 4 头猪?2 只鸡? 头奶牛。好Q让我们再次重新表征…?/p>
我:“MarcusQ…? 头猪?2 只鸡?头奶牛!?/p>
MarcusQ“好的”?/p>
我:“MarcusQ现在是什么状态??/p>
MarcusQ? 头猪?2 只鸡? 头奶牛”?/p>
我:“好Q?/p>
看到了吗Q就q样单?/p>
Z?RPC 也不够好Q?/strong>
从逻辑角度来看Qؓ什么会更加青睐 REST 而不?RPCQRemote Procedure CallQ远E过E调?Q,因ؓ它极大的降低了我们沟通的复杂度,通过把表征作为唯一的沟通的方式。无需去讨E(d一头牛Q增加一U动物类型?l鸡的数量翻倍还是卖掉所有猪Q)我们只需讨论表征Qƈ且用这个表征来辑ֈ我们惌的目标,很简单,不是吗?我不希望?Marcus 的沟通失败,因ؓ我们彼此的理解过E会不一P所以只需要知道最后的状态就行。但q仅仅是创徏 RPC 会生许多问题之一。如果你使用 RPCQ你需要设计一些程序嵌入到某种l构中。这U结构需要存储参数、错误的代码、返回值等。我已经看到许多公司q样做,他们设计自己?RPC-l构来实现客L与服务器端的交互Q但却生许多问题。你Z么要q么做?Z么要创徏自己?RPC-l构Q这样做的好处是Q倘若我想要让应用E序使用许多 WebServiceQƈ且这?WebService 带有多个 RPC-格式属性?那么我不得不d发一些类DL东西Q?/p>
如果你们真的需?RPCQ至要选择一个类?SOAP 的标准?/p>
?SOAP 也很p糕
即 RPC 的标准真的很令h痛苦Q但我不得不承认 ACID 事务Q一个完整的标准化服务描q性语a SOAPQSimple Object Access ProtocolQ简单对象访问协议)在某些环境下表现的还不错。尽如此,SOAP 产品的性能开销很大Q它是一个巨大的性能杀手。虽?REST 不是一个标准,但在实现 RESTful Web 服务时可以用其他各U标准(比如 HTTP、URL、XML、PNG {)?/p>
Session 更邪?/strong>
你无需 SessionQ但有h会说Q“我惌保存用户购物车里的商品,所以我必须?SessionQ”不Q这h是错误的Q即使没?SessionQ你也可以做你Q何你惛_的事情。你可以只需?URL 里封装购物R信息Q或者ؓ购物车创建另一个资源,比如?carts/5235”?/p>
不需要与客户端进行会话,通过q些操作Q指?URL 里封装购物R信息Q或者ؓ购物车创建另一个资源,比如?carts/5235”)后,客户端向服务器发求后Q哪怕你在服务器上执行卸载^台和操作pȝ、拆除服务器g、重新组装服务器、重新安装操作系l、^台、应用程序备份恢复操作,也不会媄响客L?/p>
不要客户端保存状态,q样做不仅复杂,而且q会带来许多问题Q你应该从你?Web 应用E序里删除有状态的东西?/p>
不要重造超媒体
目前Q超媒体已经相当普及Q我提醒大家Q不要再去重新造轮子。这里已l有许多Q够你使用了:
采用原子链接规范的超媒体Q类?spring-hateoas ?spring-data-rest?/p>
JSON-HAL
JSON-LD