REST 是应用于编程样式和 HTTP 协议的经过深思熟虑的敏感限制集合。REST 提倡通用的基于 URL 的资源寻址语法、一小组标准 HTTP 方法、无状态客户机-服务器协议、XML 文档和用于表示资源的其他媒体类型。
如果觉得非常熟悉,那是因为 REST 捕获了让现有 Web 成功的本质,而没有施加一层新的复杂性。您可能已经在使用 REST 了,但还不知道!
我们看 Roy Fielding 在他的论文中是如何定义 REST 的:
“REST 通过将消息限制为自描述性来启用中间处理:请求之间的交互是无状态的,标准方法和媒体类型用于指明语义和交换信息,响应显式指明高速缓存能力。”
从 理论角度看,REST 建议,应按照客户机的基本需求而非服务器无故的功能和需求来定义接口。Interface Segregation Principle 建议,设计协议和库接口时应使其依赖性的耦合或 “表面积” 降到最小。应用这些原则会得到小型、简单、特殊用途的接口和协议,比如我们将开发的 knock-knock PHP 库和 XML 协议。
从实践角度看,许多用户和服务器通过多个级别的防火墙、隧道、网关、过滤器、代理和灰鸽子连接到 Internet。REST 使用标准 HTTP 协议,很容易通过防火墙。它使用无状态协议,而不是服务器会话和 cookie,所以在应对网络和服务器失败方面非常健壮。使用 URL 和资源定位器以及 HTTP GET
方法使其高速缓存友好且高效。
REST 尽量最小化网络、客户机和服务器的负载,所以在庞大的不可预测的 Internet 上表现非常好。它过量的高速缓存友好性降低了客户机-服务器往返次数,从而挽救了由于不可避免事故引起的无数珍贵数据包和灰鸽子的丢失。
REST 是突然流行起来的时髦术语之一,利用文字游戏得到了大肆宣传。它听起来不错,而且可以与其他大肆宣传但极其有用的技术(比如 XML 和 Ajax)很好地一起工作。与 Relax NG 一样,REST 不仅基于正确的理论基础,还基于在现实世界中的实践经验。只是您必须忍受所有痛苦的双关语、厌烦的时髦词和讽喻的头韵(我很遗憾这一点,但没法抵抗)。
REST 建议了几个约束,其中一些我们今天将遵守,另外一些由于实践原因我们将绕开。
-
使用无状态协议
- 每个请求应包含服务器确定要做什么所需的所有信息,而且服务器不需要保留与客户机关联的信息或使用 cookie 存储客户端会话信息。当然,服务器可以在其数据库中创建和更新对象,但这被当作 “资源” 而非 “会话状态” 来看待。从而使得协议在应付服务器和网络失败方面更加健壮。
-
将资源表示为 XML 文档和其他媒体类型
- 服务器可以按所需要的任意内部格式存储资源,但在显示给用户时不能将其表示为标准自描述媒体类型,比如 XML 文档和标准 MIME 文件类型。HTTP 头应将文件类型及其高速缓存能力显式告诉客户机。
-
使用标准 HTTP 方法
-
HTTP 定义了一组标准方法,包括
GET
、PUT
、POST
和DELETE
。协议应适时地支持这些方法并避免定义非标准的特殊用途 HTTP 方法。但是,我们可以通过使用 URL 路径参数以及GET
或POST
参数来发送任意消息。
-
使用 URL 寻址资源
- 每个对象都应有自己的 URL,我们不应使用相同的 URL 寻址多个对象。理想地,RESTian URL 包含对象的路径,可选地,后面可接应用于该对象的方法的动词。