答:REST与另外两种分布式应用架构风格DO(分布式对象)、RPC(远程过程调用)的主要区别,在于它要求必须以统一的接口来对资源执行各种操作。这个统一接口正是由HTTP 1.1协议(RFC2616)来定义的,这也正是设计HTTP 1.1协议的主要目的。由HTTP 1.1协议定义的统一接口包括了以下的内容: a. 用来与资源交互的6个标准的HTTP方法:GET/POST/PUT/DELETE/HEAD/OPTIONS(在RFC2616中还定义了其他几个方法,但是这几个方法不是用来与资源交互的)。最常用的是前面的GET/POST/PUT/DELETE这4个方法。 b. 一些标准的HTTP头信息字段(HTTP header fields)。头信息字段在HTTP消息中以名称-值对的形式出现,分为通用头信息(general header fields)、请求头信息(request header fields)、响应头信息(response header fields)、实体头信息(entity header fields)4种类别,用来完整表达HTTP消息的操作语义,或者对消息的安全性、缓存等方面加以控制。详情请看RFC2616。 c. 一些标准的HTTP响应状态代码(status codes)。其中100-199代表临时性的响应,仅仅用在与客户端-服务器端握手协商的阶段;200-299代表请求成功完成;300-399代表请求应该重定向;400-499代表因客户端错误导致的请求无法完成;500-599代表因服务器端错误导致的请求无法完成。详情请看RFC2616。 d. 一套通用的访问身份认证框架(general framework for access authentication)。推荐的两种可选的身份认证机制HTTP Basic Authentication和HTTP Digest Authentication,定义在RFC2617(HTTP Authentication: Basic and Digest Access Authentication)中。 e. 在客户端-服务器端之间用来确定资源表述格式的标准的内容协商(content negotiation)机制。 f. 对于HTTP响应消息体(message body)的标准的缓存机制,包括了两种缓存模型:过期模型(expiration model)和验证模型(validation model)。

对于以上所述的统一接口内容,需要补充以下一些注意事项: a. 对于一个特定的资源,客户端应用可以执行的操作是有限的。让一个资源(一个URI)承担过多的职责,这是一种错误的设计。不必担心定义更多的资源(更多的URI)有什么问题,这对Web应用的可伸缩性来说只有好处没有坏处。 b. 按照HTTP 1.1协议的规定:GET方法是安全的且幂等的,PUT/DELETE方法是不安全的但是幂等的,而POST方法是既不安全也不幂等的。严格遵守HTTP协议的这个规定,是非常重要的。“人有多大胆、地有多大产”的做法(例如:使用GET请求对资源执行所有操作)只会带来灾难性的后果。 c. 将GET/POST/PUT/DELETE这4种方法映射为针对资源的CRUD操作,只是一种最为常见的设计模式(因为Ruby on Rails而流行开来),这种设计模式并不是REST或者HTTP 1.1协议强制要求的。 d. 统一接口的要求不仅仅适用于HTTP通信链条两端的user agent和origin server,还普遍适用于通信链条中的所有中间组件(intermediary components)。某个中间组件与其直接相邻组件之间的交互,也必须使用相同的统一接口。 e. 按照REST的要求,应该尽量确保操作语义对于HTTP通信链条上中间组件的可见性,因此操作的语义必须由HTTP头信息来完全表达。 f. 除了HTTP 1.1协议中定义的这些标准的头信息字段外,在必要的时候,应用也可以使用自定义的头信息字段。不过,当与防火墙打交道时,需要确保防火墙不至于因无法理解这些自定义的头信息字段,而禁止其所属的HTTP消息的收发。 g. 除了HTTP 1.1协议中定义的这些标准的响应状态代码外,在必要的时候,应用也可以使用自定义的响应状态代码,以代表某些自定义的出错状态。 h. HTTP 1.1协议在安全性方面的设计相当灵活。它定义了一套基于质询-响应(challenge-response)过程的通用的访问身份认证框架,而不是强制应用使用某种特定的身份认证机制。除了推荐的两种身份认证机制Basic和Digest外,应用系统可以很灵活地插入自定义的认证机制(例如:插入基于LDAP的认证机制)。只要仍然遵循HTTP 1.1协议定义的这个通用的访问身份认证框架,就不会破坏REST所要求的统一接口和操作语义对于中间组件的可见性。 i. 统一接口保证了操作语义对于中间组件的可见性,正因为如此,才有可能对HTTP消息进行高效的缓存。缓存是改善网络调用读操作性能的关键,HTTP 1.1协议为实现缓存提供了非常完善的机制。缓存可以在HTTP通信链条的很多地方实现,例如user agent、http proxy、reverse proxy server、origin server等等。