背景
在前一篇文章中关于 REST API,你了解多少?,我们聊到了 REST 六大指导原则,有些原则不太容易理解,这次我们详细说明一下。
-
统一接口(Uniform Interface):定义了一组通用的接口约束,包括资源的标识、资源的操作和资源的表示。这样可以使不同的组件之间更加松耦合,提高系统的可扩展性和可维护性。
-
客户端-服务器(Client-Server):将应用程序分为客户端和服务器两个部分,它们之间通过接口进行通信。这种分离可以提高系统的可扩展性和简化组件的开发。
-
无状态(Stateless):无状态性要求从客户端到服务器的每个请求都必须包含理解和完成请求所需的所有信息。 服务器无法利用服务器上任何先前存储的上下文信息。因此,客户端应用程序必须完全保留会话状态。服务器不会保存客户端的状态信息,每个请求都是独立的。这样可以减少服务器的负担,提高系统的可伸缩性。
-
缓存(Cache):客户端可以缓存服务器的响应,以减少网络传输和提高性能。服务器可以通过设置响应头来控制缓存的行为。
-
分层系统(Layered System):将系统分为多个层次,每个层次都有特定的功能和责任。这样可以提高系统的可扩展性和安全性。例如常见的 MVC
-
按需代码(Code on Demand):服务器可以向客户端传输可执行代码,以扩展客户端的功能。这种方式在 REST 中并不是必须的,但是它可以提高系统的灵活性和可扩展性。
其中就 Uniform Interface 不太好理解,我们重点看一下:
Uniform Interface
在REST架构中,Uniform Interface是其中一个重要的约束条件,它要求在客户端和服务器之间的交互中使用统一的接口。这个接口应该是简单、通用、标准化的,以便于不同的客户端和服务器之间进行交互。
Uniform Interface的设计目标是将客户端和服务器解耦,使得它们可以独立地演化。客户端和服务器之间的通信只依赖于接口的定义,而不依赖于具体的实现细节。这样,当服务器的实现发生变化时,客户端不需要做出任何修改,只需要遵循同样的接口即可。
Uniform Interface包括以下四个约束条件:
-
资源标识符(Resource Identification):每个资源都应该有一个唯一的标识符,通常使用URI来标识资源。
-
操作资源的表现形式来实现对资源的操作(Manipulation of resources through representations"):资源在服务器响应中应具有统一的表示形式。 API 使用者应该使用这些表示来修改服务器中的资源状态。 "Manipulation of resources through representations" 是 REST 架构风格的一个关键概念,它指的是客户端通过操作资源的表现形式来实现对资源的操作。 在 REST 中,资源是指网络上的任何东西,比如文本、图片、视频、数据库记录等等。每个资源都有一个唯一的标识符(URI),客户端可以通过这个标识符来访问资源。而资源的表现形式则是指资源的具体表现形式,比如文本可以是 HTML、XML、JSON 等格式,图片可以是 JPEG、PNG 等格式。客户端可以通过请求不同的表现形式来获取资源的不同表现形式。 在 REST 中,客户端通过对资源的表现形式进行操作来实现对资源的操作。比如,客户端可以通过 POST 请求来创建一个新的资源,请求的数据就是新资源的表现形式;通过 PUT 请求来更新一个资源,请求的数据也是资源的表现形式;通过 DELETE 请求来删除一个资源,请求的 URI 就是要删除的资源的标识符( 这个比如,不是特别的贴切 )。 因此,"Manipulation of resources through representations" 的含义就是客户端通过操作资源的表现形式来实现对资源的操作。这种方式使得客户端和服务器之间的通信更加灵活和可扩展。
-
自描述消息(Self-descriptive Messages):每个资源应该携带足够的信息来描述如何处理消息。它还应该提供客户端可以对资源执行的附加操作的信息。 消息应该包含一个类型,以指示消息的格式和语法。这使得客户端可以根据类型来解析消息,并采取适当的行动。比如 HTTP 中的 content-type
-
超媒体作为应用程序状态的引擎(Hypermedia as the Engine of Application State):客户端应该只有应用程序的初始 URI。客户端应用程序应使用超链接动态驱动所有其他资源和交互。 具体来说,HATEOAS 原则要求 RESTful API 返回的响应中包含超媒体链接,这些链接描述了客户端可以采取的下一步操作。这些链接可以是任何类型的链接,例如 URL、表单、控件、status_code等,它们描述了客户端可以采取的操作以及如何执行这些操作。 通过使用 HATEOAS,RESTful API 可以将应用程序状态的控制权交给客户端,而不是服务器。这意味着客户端可以根据服务器返回的超媒体链接来决定下一步要采取的操作,而无需事先了解服务器的 API 或其他约定。这种方式可以使客户端和服务器之间的耦合更加松散,从而提高系统的可重用性和可扩展性。
总结
简而言之,在 REST 架构风格中,数据和功能被视为资源,并使用统一资源标识符 (URI) 进行访问。 通过使用一组简单、定义明确的操作来对资源进行操作。 此外,资源必须与其表示形式分离,以便客户端可以访问各种格式的内容,例如 HTML、XML、纯文本、PDF、JPEG、JSON 等。客户端和服务器通过使用标准化的接口和协议来交换资源的表示。 通常 HTTP 是最常用的协议,但 REST 并不强制要求它。最重要的是,与服务器的每次交互都必须是无状态的。 所有这些原则都有助于 RESTful 应用程序变得简单、轻量级和快速。