了解如何使用 REST 范例设计 Web 服务
REST 或 REpresentational State Transfer 是一种架构风格,用于在 Web 上的计算机系统之间提供标准,使系统之间更容易相互通信。符合 REST 的系统,通常称为 RESTful 系统,其特点是它们是无状态的,并且将客户端和服务器的关注点分开。我们将深入探讨这些术语的含义以及为什么它们是 Web 服务的有益特征。
在 REST 架构风格中,客户端的实现和服务器的实现可以独立完成,彼此不知道对方。这意味着客户端的代码可以随时更改而不影响服务器的运行,而服务器端的代码可以更改而不影响客户端的运行。
只要双方都知道要发送给对方的消息格式,它们就可以保持模块化和分离。将用户界面关注点与数据存储关注点分开,我们提高了跨平台界面的灵活性,并通过简化服务器组件来提高可扩展性。此外,分离允许每个组件独立发展的能力。
通过使用 REST 接口规范,不同的客户端访问相同的 REST 端点、执行相同的操作并接收相同的响应。
遵循 REST 范式的系统是无状态的,这意味着服务器不需要知道客户端处于什么状态,反之亦然。这样,服务器和客户端都可以理解收到的任何消息,即使没有看到以前的消息。这种无状态约束是通过使用资源而不是命令来实现的。资源是 Web 的名词——它们描述 了您可能需要存储或发送到其他服务的任何对象、文档或事物。
因为 REST 系统通过对资源的标准操作进行交互,所以它们不依赖于接口的实现。
这些约束有助于 RESTful 应用程序实现可靠性、快速性能和可扩展性,作为可以在不影响整个系统的情况下进行管理、更新和重用的组件,即使在系统运行期间也是如此。
现在,我们将探讨在实现 RESTful 接口时客户端和服务器之间的通信是如何实际发生的。
在 REST 架构中,客户端发送请求以检索或修改资源,服务器发送对这些请求的响应。让我们看一下发出请求和发送响应的标准方法。
REST 要求客户端向服务器发出请求,以便检索或修改服务器上的数据。请求通常包括:
一个 HTTP 动词,它定义了要执行的操作类型
一个标头,允许客户端传递有关请求的信息
资源路径
包含数据的可选消息正文
我们在请求中使用 4 个基本的 HTTP 动词来与 REST 系统中的资源进行交互:
GET — 检索特定资源(通过 id)或资源集合
POST — 创建一个新资源
PUT — 更新特定资源(按 id)
DELETE — 按 id 删除特定资源
在请求的标头中,客户端发送它能够从服务器接收的内容类型。这称为Accept字段,它确保服务器不会发送客户端无法理解或处理的数据
MIME 类型,用于指定Accept字段中的内容类型,由 atype和 a组成subtype。它们由斜线 (/) 分隔。
例如,包含 HTML 的文本文件将被指定为 type text/html。如果此文本文件包含 CSS,则将其指定为text/css. 通用文本文件将表示为text/plain. 但是,此默认值text/plain不是万能的。如果客户端期待text/css并接收text/plain,它将无法识别内容。
其他类型和常用的亚型:
image— image/png, image/jpeg,image/gif
audio — audio/wav,audio/mpeg
video— video/mp4,video/ogg
application — application/json, application/pdf, application/xml,application/octet-stream
例如,客户端访问服务器上资源中具有id23 的articles资源可能会发送如下 GET 请求:
GET /articles/23
Accept: text/html, application/xhtml
在这种情况下,Accept标头字段表示客户端将接受text/htmlor中的内容application/xhtml。
请求必须包含指向应该对其执行操作的资源的路径。在 RESTful API 中,应该设计路径以帮助客户端了解正在发生的事情。
按照惯例,路径的第一部分应该是资源的复数形式。这使嵌套路径易于阅读和理解。
fashionboutique.com/customers/223/orders/12即使您以前从未见过此特定路径,类似路径的指向也很清楚,因为它是分层的和描述性的。我们可以看到,我们正在为223id的客户访问 12的订单。id
路径应包含定位具有所需特异性程度的资源所需的信息。在引用资源列表或资源集合时,并不总是需要添加id. 例如,对fashionboutique.com/customers路径的 POST 请求不需要额外的标识符,因为服务器将为id新对象生成一个。
如果我们试图访问单个资源,我们需要id在路径上附加一个。例如: GET fashionboutique.com/customers/:id— 检索具有指定 的customers资源中的项目。— 删除指定资源中的项目。idDELETE fashionboutique.com/customers/:idcustomersid
在服务器向客户端发送数据有效负载的情况下,服务器必须content-type在响应的标头中包含 a。此content-type标头字段提醒客户端它在响应正文中发送的数据类型。这些内容类型是 MIME 类型,就像它们在accept请求标头的字段中一样。服务器在响应中发回的content-type应该是客户端在accept请求字段中指定的选项之一。
例如,当客户端使用此 GET 请求访问资源中的id23资源时:articles。
GET /articles/23 HTTP/1.1
Accept: text/html, application/xhtml
服务器可能会发送回带有响应头的内容:
HTTP/1.1 200 (OK)
Content-Type: text/html
这表示请求的内容在响应正文中以content-typeof形式返回text/html,客户端表示它能够接受。
来自服务器的响应包含状态代码以提醒客户端有关操作成功的信息。作为开发人员,您不需要知道每个状态码(其中有很多),但您应该知道最常见的状态码以及它们的使用方式:
状态码 | 意义 |
---|---|
200(好) | 这是成功的 HTTP 请求的标准响应。 |
201(已创 | 建)这是成功创建项目的 HTTP 请求的标准响应。 |
204(无内容) | 这是成功 HTTP 请求的标准响应,响应正文中没有返回任何内容。 |
400(错误请求) | 由于请求语法错误、大小过大或其他客户端错误,无法处理该请求。 |
403(禁止) | 客户端无权访问此资源。 |
404(未找到) | 此时找不到资源。它可能已被删除,或者尚不存在。 |
500内部服务器错误) | 如果没有更具体的信息可用,则为意外失败的通用答案。 |
对于每个 HTTP 动词,服务器应在成功时返回预期的状态代码:
GET — 返回 200(确定)
POST — 返回 201(已创建)
PUT——返回 200(OK)
DELETE — 返回 204 (NO CONTENT) 如果操作失败,返回与遇到的问题相对应的最具体的状态码。
假设我们有一个应用程序,允许您查看、创建、编辑和删除托管在小型服装店的客户和订单fashionboutique.com。我们可以创建一个允许客户端执行这些功能的 HTTP API:
如果我们想查看所有客户,请求将如下所示:
GET http://fashionboutique.com/customers
Accept: application/json
可能的响应标头如下所示:
Status Code: 200 (OK)
Content-type: application/json
其次是格式customers要求的数据application/json。
通过发布数据创建新客户:
POST http://fashionboutique.com/customers
Body:
{
“customer”: {
“name” = “Scylla Buss”,
“email” = “[email protected]”
}
}
然后,服务器id为该对象生成一个并将其返回给客户端,其标头如下:
201 (CREATED)
Content-type: application/json
要查看单个客户,我们通过指定该客户的 id 来获取它:
GET http://fashionboutique.com/customers/123
Accept: application/json
可能的响应标头如下所示:
Status Code: 200 (OK)
Content-type: application/json
后面是格式为23的customer资源数据。idapplication/json
我们可以通过PUT新数据更新该客户:
PUT http://fashionboutique.com/customers/123
Body:
{
“customer”: {
“name” = “Scylla Buss”,
“email” = “[email protected]”
}
}
可能的响应标头将具有Status Code: 200 (OK), 以通知客户端带有id123 的项目已被修改。
我们还可以通过指定其删除该客户id:
DELETE http://fashionboutique.com/customers/123
响应将有一个包含 的标头Status Code: 204 (NO CONTENT),通知客户端带有id123 的项目已被删除,而正文中没有任何内容。如果大家想了解更多相关知识,可以关注一下极悦的Java极悦在线学习,里面的课程内容从入门到精通,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习