本节书摘来华章计算机出版社《javascript应用程序设计》一书中的第1章,第1.13节,作者:eric elliott 更多章节内容可以访问云栖社区“异步社区”公众号查看。
表述性状态传递(representational state transfer,rest)是客户端与服务端的通信架构,rest架构采用关注点分离原则在数据资源与数据消费者之间建立了多层结构。在这种架构体系下,服务端仅关注数据资源的管理,而无需操心界面实现,客户端则可以以任何形式或语言去做界面实现。rest架构并不关心界面是被谁或是被怎样实现的,它仅处理并维护客户端与服务端的应用程序状态。
restful应用使用http方法(post、get、put 和 delete)来告诉服务器,客户端当前对资源的操作行为,这些行为包括:
· 在资源集合创建条目: http post。
· 获取资源状态: http get。
· 更新(替换)资源: http put。
· 删除资源或资源集合: http delete。
如果你熟悉数据库的crud(创建、检索、更新和删除)操作,你会觉得上述行为与crud很相似,你可以将它们对号入座,不过要记住,在rest中,更新资源意味着将资源替换。
图1-2是一个较为典型的状态传递时序图。

图1-2:rest时序图
客户端通过http get请求服务端上的统一资源指示符(uri)来获取数据。在服务端上每个资源对应唯一的uri。
服务端从数据库或缓存中检索数据,随后将之封装成客户端所需的数据结构返回。
数据以文档的形式被返回,一般包含了经过json编码后的对象,尽管rest并没有严格指定数据交换格式。现今仍旧有不少基于xml的restful应用,随着json慢慢成为一项标准,越来越多的restful应用同时支持json与xml两种数据交换
格式。
客户端接收并处理数据。
客户端通过http put请求服务端同一uri上报处理过的数据。
用经put请求上报的数据替换服务端原有的数据。
使用put还是post做资源更新常常是一个让人感到困惑的问题,rest制定了资源访问的规则。除非客户端本身可以提供较为安全的唯一id标识符,否则在资源集合新建资源的操作一律采用post方式处理。在这种情形下,服务端生成id标识符并返回给客户端。
例如, 你可以通过post方法访问服务端的/users/资源路径从而创建一个新用户,此时服务端会给新用户生成一个唯一id标识符,随后你便可以通过/users/userid/资源路径获取该资源。在服务端每一个唯一的uri路径对应一个新的用户,post方法不能用于更新或修改现有的资源集,仅能够做资源添加。
而使用put方法访问服务端的/user/userid资源路径,则可以更新用户的信息,注意,这项操作将完全将原有的资源替换,所以请确保所更新资源内容的信息完整性。
在第8章中我们会详细介绍rest架构。