答:在HTTP协议和REST中,“resource”(资源)这个单词是有特定含义的,并不是我们通常所理解的那种广义的资源。“resource”的含义是:服务器端暴露给外界访问的某种能力。当然,服务器端拥有很多广义的资源,包括CPU、内存、存储等等。但是如果这些广义的资源并没有直接暴露给外界访问,那么对于外界来说,它们并不是(可以利用的)资源。

REST是一种分布式应用的架构风格。REST看待服务器的角度,与另外两种分布式应用架构风格DO(分布式对象)、RPC(远程过程调用)有很大差别。REST将服务器看作是由很多离散的资源组成,每一个资源都有一个命名,并且拥有一个URI作为访问地址(也可以拥有多个URI。资源的命名和其URI地址,在实战场合可以不加区分)。对某个资源感兴趣的客户端应用,可以通过该资源的URI与其交互。 和面向对象编程中的“对象”类似,资源也是以名词为核心来组织的。同样地,和“对象”类似,资源也是一个抽象的工具。任何可以命名的抽象概念,都可以通过将其定义为一个资源,暴露给外界访问。也就是说,资源不仅仅可以代表服务器上的一个文件、数据库中的一张表等等具体的东西。只要想象力允许,资源的定义可以要多抽象有多抽象。因为REST鼓励的是大粒度的网络交互,通常不应该设计粒度过细的资源,否则会因为网络调用太过频繁,对应用的性能造成致命影响。

客户端应用与资源的交互,是通过资源的“representation”(表述)来间接完成的。资源的表述是一段对于资源(在某个特定时刻的)状态的描述。客户端请求资源的表述,对表述加以修改,然后将修改过的表述发送给服务器端,请求服务器端对资源执行某种(局部的或者完全的)状态改变。在客户端-服务器端之间转移的,并不是资源本身,而是资源的表述。缩写词REST中的“state transfer”翻译为“状态转移”,在客户端-服务器端之间转移的资源表述,所代表的正是资源的当前状态。 资源的表述,可以有多种格式,例如json/xml/html/纯文本等等。服务器发送给客户端的资源表述的格式,可以通过定义在HTTP协议中的标准的内容协商(content negotiation)机制来确定。