专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 什么是rest风格

什么是rest风格

更新时间:2022-08-10 11:05:27 来源:赢咖4 浏览938次

什么是 REST?

了解如何使用 REST 范例设计 Web 服务

代表性状态转移

REST 或 REpresentational State Transfer 是一种架构风格,用于在 Web 上的计算机系统之间提供标准,使系统之间更容易相互通信。符合 REST 的系统,通常称为 RESTful 系统,其特点是它们是无状态的,并且将客户端和服务器的关注点分开。我们将深入探讨这些术语的含义以及为什么它们是 Web 服务的有益特征。

客户端和服务器分离

在 REST 架构风格中,客户端的实现和服务器的实现可以独立完成,彼此不知道对方。这意味着客户端的代码可以随时更改而不影响服务器的运行,而服务器端的代码可以更改而不影响客户端的运行。

只要双方都知道要发送给对方的消息格式,它们就可以保持模块化和分离。将用户界面关注点与数据存储关注点分开,我们提高了跨平台界面的灵活性,并通过简化服务器组件来提高可扩展性。此外,分离允许每个组件独立发展的能力。

通过使用 REST 接口规范,不同的客户端访问相同的 REST 端点、执行相同的操作并接收相同的响应。

无国籍状态

遵循 REST 范式的系统是无状态的,这意味着服务器不需要知道客户端处于什么状态,反之亦然。这样,服务器和客户端都可以理解收到的任何消息,即使没有看到以前的消息。这种无状态约束是通过使用资源而不是命令来实现的。资源是 Web 的名词——它们描述 了您可能需要存储或发送到其他服务的任何对象、文档或事物。

因为 REST 系统通过对资源的标准操作进行交互,所以它们不依赖于接口的实现。

这些约束有助于 RESTful 应用程序实现可靠性、快速性能和可扩展性,作为可以在不影响整个系统的情况下进行管理、更新和重用的组件,即使在系统运行期间也是如此。

现在,我们将探讨在实现 RESTful 接口时客户端和服务器之间的通信是如何实际发生的。

客户端和服务器之间的通信

在 REST 架构中,客户端发送请求以检索或修改资源,服务器发送对这些请求的响应。让我们看一下发出请求和发送响应的标准方法。

发出请求

REST 要求客户端向服务器发出请求,以便检索或修改服务器上的数据。请求通常包括:

一个 HTTP 动词,它定义了要执行的操作类型

一个标头,允许客户端传递有关请求的信息

资源路径

包含数据的可选消息正文

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 的项目已被删除,而正文中没有任何内容。如果大家想了解更多相关知识,可以关注一下赢咖4的Java赢咖4在线学习,里面的课程内容从入门到精通,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>