寻求 REST

简介: 寻求 REST

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

在当前的文献中,REST 通常被宣传为自切片面包以来最好的东西。然而,它伴随着许多挑战。Martin Fowler 写了一篇关于REST 荣耀的文章。他列出了使 API 成为真正的REST 的三个步骤:

网络异常,图片无法展示
|

在每个步骤中,问题都潜伏着。这篇博文重点列出了其中的一些问题并提供了解决方法的提示。

资源

REST 从 SOAP 的缺点中脱颖而出。SOAP 提供单个端点并根据有效负载执行代码。REST 的思想是提供多个端点,每个端点执行不同的代码。

老实说:现阶段几乎没有什么问题。最大的一个涉及从现有身份猜测一个身份。如果资源 ID 是连续的甚至只是数字,则很容易猜测其他资源的端点,例如,从/customers/1/customers/2。解决方案是使用非连续的非数字 id,即通用唯一标识符

让我们走上 REST 成熟度模型。

HTTP 动词

HTTP 动词是迈向 REST 荣耀的下一步。它们来自“过去”与 HTML 的交互。交互来自CRUD操作。

这很简单:

手术  动词 
创建  POST
读  GET
更新  PUT PATCH
删除  DELETE

API 的主要问题是您需要超越 CRUD。让我们想象一个银行转账的具体例子:它从一个账户中取款并将其转移到另一个账户。我们应该如何建模呢?

我们可以使用原始帐户作为资源,例如 , /accounts/a1b2c3d4e5f6. 目标账户、金额等可以作为查询参数或在正文中传递。但是我们应该使用什么 HTTP 动词呢?

它确实改变了已识别的资源,但它有“副作用”。它还更改了另一个资源:目标帐户。以下是关于如何管理 HTTP 谓词的几个选项:

  • 使用POST,因为它会更改源资源。它具有误导性,因为它没有说明副作用。
  • 使用专用的 HTTP 动词,例如TRANSFER. 它不是不言自明的,并且与 REST 原则相反。
  • POST与所谓的自定义方法一起使用。自定义方法是 Google API 改进建议

自定义方法只能用于无法通过标准方法轻松表达的功能;如果可能,更喜欢标准方法,因为它们具有一致的语义。

HTTP URI必须使用一个:字符后跟自定义动词。

  • 这是我们的银行账户转账 URI /accounts/a1b2c3d4e5f6:transfer:。
    最好的选择是什么?“这取决于。”

超媒体

Fowler 将超媒体控件描述为实现 REST 荣耀的最终步骤。它现在被称为HATEOAS:

使用 HATEOAS,客户端与网络应用程序交互,其应用程序服务器通过超媒体动态提供信息。除了对超媒体的一般理解之外,REST 客户端几乎不需要了解如何与应用程序或服务器交互。

--维基百科上的 HATEOAS

HATEOAS 是一个概念。这是从维基百科获取的可能实现。当一个人请求一个银行账户时,例如/accounts/a1b2c3d4e5f6,响应包含指向对该特定银行账户可能采取的行动的链接:

如果余额为负数,则只有存款链接可用:

REST 的一个常见问题是缺乏标准。HATEOAS 也不例外。实现某种程度标准化的第一个尝试是JSON 超文本应用程序语言,又名 HAL。请注意,它是在 2012 年开始的:最新版本是 2016 年的,目前仍处于草案阶段。

这是一个总结提案的快速图表:

网络异常,图片无法展示
|

  1. 可用链接
  2. 链接到自己
  3. 告诉可以使用哪个 HTTP 动词
  4. 存款链接

标准化的另一种尝试是RFC 8288,又名 Web 链接。它描述了格式并包含一个链接关系注册表,例如,alternatecopyright。与 HAL 最显着的区别是 RFC 8288 通过 HTTP 响应标头传达链接。

网络异常,图片无法展示
|

  1. 链接到具有非标准self关系类型的当前资源
  2. 使用扩展https://my.bank/deposit关系类型和任意title目标属性存放链接

其他替代媒体类型规范可用。

名称  描述  由...提供 
交换陈述的统一基础 UBER 文档格式是一种最小的读/写超媒体类型,旨在支持简单的状态传输和基于临时超媒体的转换。该规范描述了该格式的 XML 和 JSON 变体,并提供了支持通过 HTTP 协议进行 UBER 编码消息的指南。 个人 
集合+JSON Collection+JSON 是一种基于 JSON 的读写超媒体类型,旨在支持简单集合的管理和查询。 个人 
JSON:API  JSON:API 是关于客户端应如何请求获取或修改资源以及服务器应如何响应这些请求的规范。 JSON:API 可以通过扩展和配置文件轻松扩展。 个人 
警笛 Siren 是一种用于表示实体的超媒体规范。由于 HTML 用于直观地表示网站上的文档,因此 Siren 是一种通过 Web API 呈现实体的规范。Siren 提供结构来传达有关实体的信息、执行状态转换的操作以及客户端导航的链接。 个人 
应用程序级配置文件语义 ALPS 文档可以用作配置文件来解释具有与应用程序无关的媒体类型(例如 HTML、HAL、Collection+JSON、Siren 等)的文档的应用程序语义。这增加了跨媒体类型的配置文件文档的可重用性。 IETF

奖励:HTTP 响应状态

Fowler 的帖子没有提到的是 HTTP 响应状态。大多数读者都熟悉状态范围:

  • 信息响应:100 – 199
  • 成功回复:200 – 299
  • 重定向消息:300 – 399
  • 客户端错误响应:400 – 499
  • 服务器错误响应:500 – 599

同样,大多数也具有定期发现的 HTTP 状态:

问题在于,除了这些简单的案例之外,它还是一团糟。例如,看看这个StackOverflow 问题:“哪个 HTTP 状态代码表示尚未准备好,稍后再试?” 以下是建议答案的摘要,从最高票数到最低票数:

  • 503服务不可用
  • 202 Accepted(接受的答案)
  • 423 锁定
  • 404 未找到
  • 302 找到
  • 409 冲突
  • 501 未实施(否决)

这不是一个直截了当的答案:围绕替代方案存在很多争论。作为记录,我认为接受的答案是正确的。

这在设计者方面已经很多了,但客户端也包含很多不确定性,因为一些大型 API 提供商使用他们自己的 HTTP 状态代码

结论

“REST 的荣耀”意义不大。尽管有任何相反的说法,但没有可依赖的单一语义。事实上,它主要取决于实现和解释:两者都需要记录自定义行为而不是依赖共享规范。

SOAP 最大的缺陷是它的复杂性和它对大公司的关注,但它至少提供了一套共享的标准规范。业界用 REST 取代了它:不是规范,而是架构站点。REST 更简单,因此更容易上手,但它需要大量定制工作,这因项目而异。

有提供一些标准化的倡议,但它们很少,而且有些与其他的不一致。而且,他们的吸引力很低,所以人们不知道他们,这就造成了恶性循环。我几乎不提倡回到 SOAP,尽管我有时确实会怀念它。


相关文章
|
缓存 Java Spring
Spring框架(四) 三级缓存与循环依赖
首先我们需要明白什么是循环依赖 , 打个比方 , 就是说A对象在创建的过程中 , 需要依赖注入B对象 , 但是B对象没有 , 就需要去创建 , 而在创建B对象的过程中又需要注入A对象 , A对象此时还在创建中,所以就构成了一个死循环 , A,B相互依赖 这样的关系被成为循环依赖(当然 , 可能还会有其他的情况),下面我们就来看看Spring是如何让解决循环依赖的
432 0
|
数据采集 存储 架构师
上进计划 | Python爬虫经典实战项目——电商数据爬取!
在如今这个网购风云从不间歇的时代,购物狂欢持续不断,一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时,“如何省钱?”成为了大家最关心的问题。 比价、返利、优惠券都是消费者在网购时的刚需,但在这些“优惠”背后已产生灰色地带。
|
容器
Vue3弹出确认(Popconfirm)
这是一个基于Vue3的弹出确认框组件(Popconfirm),提供了丰富的自定义选项和事件处理功能。组件支持设置标题、描述、按钮文本及样式等,并可通过slot进行自定义内容。
568 1
Vue3弹出确认(Popconfirm)
|
存储 算法 安全
探索Linux的md5sum命令:保障数据完整性的利器
`md5sum`是Linux下的命令行工具,用于计算文件的MD5哈希,确保数据完整性。通过比较哈希值,它可以检测文件是否在传输或存储中被更改。常用参数包括`-b`(二进制模式)、`-c`(校验文件)、`--tag`(创建校验和文件)和`--status`(仅返回校验状态)。尽管MD5因安全性问题不建议用于加密,但仍然用于快速校验。例如,`md5sum filename.txt`计算文件哈希,`md5sum -c checksums.txt`校验文件完整性。注意,应结合安全存储和备份策略使用。
|
Apache Windows
windows源码安装apache2 win安装apache 阿帕奇服务器
windows源码安装apache2 win安装apache 阿帕奇服务器
317 0
|
API 调度 Android开发
探索Android应用程序的后台运行机制
在移动应用开发中,了解和掌握Android应用程序的后台运行机制至关重要。本文将深入探讨Android平台上应用程序的后台运行原理及其影响因素,包括后台服务、广播接收器、JobScheduler等关键组件,以及如何有效管理后台任务以提升应用性能和用户体验。
1665 3
|
监控 安全 网络安全
什么是https加密协议?
什么是https加密协议?
447 0
|
人工智能 Kubernetes Serverless
2023云栖大会 | 全球首发!容器可以Serverless形态交付算力,随需随调,太爽了!
全球首款容器计算服务 ACS(Alibaba Cloud Container Compute Service,以下简称 ACS)正式发布。具体来说,ACS 以 K8s API为算力使用界面,采用Serverless 形态的算力交付模式,用户无需关注底层节点及集群的运维管理,并且同时支持资源预留及按需弹性的模式。算力资源除了支持用户的应用负载以外,更支持了用户灵活调配给阿里云云产品的负载使用。
2468 10
|
存储 小程序
微信小程序怎样获取参数!!!
微信小程序怎样获取参数!!!
|
Ubuntu Linux
【Linux】Linux 系统编程——tree 命令
【Linux】Linux 系统编程——tree 命令
382 0