0

通过考虑 REST 原则在 Web 中的应用。我正在做一个关于 REST 的案例研究,我对统一接口有一些疑问。我假设统一接口只有一个单一的 PROCESS 而不是 HTTP 动词(例如 get、post、put、delete、head、...)。这种使用传统 HTTP 动词的过程是否有任何潜在后果?

4

1 回答 1

0

这种使用传统 HTTP 动词的过程是否有任何潜在后果?

有几个。

一个考虑因素是安全性。在 RFC-7231 中,以这种方式定义安全。

如果定义的语义本质上是只读的,则请求方法被认为是“安全的”;即,客户端不请求也不期望由于将安全方法应用于目标资源而导致源服务器上的任何状态更改。

因此,如果 PROCESS 是一个安全动词,如 GET,那么您将拥有只读网络的模拟。HTTP 规范还定义了 HEAD 和 OPTIONS(优化读取)和 TRACE(调试工具);鉴于 HTML 是一种非常成功的超媒体格式,但不包括对这些方法的支持,这表明它们对自己并不是特别挑剔。

PROCESS 的安全规范保留了 REST 的所有扩展优势。但它的效用是有限的——客户可以消费内容,但他们不能生产任何内容。

另一方面,如果 PROCESS 不安全,则无法再支持一堆用例。预取内容不再是一种选择,因为组件不能再假设调用 PROCESS 对服务器没有副作用。出于同样的原因,爬行不再是一种选择。

可能值得注意的是网络中方法的机制——超媒体格式描述了哪些方法适用于哪些链接。因此,您可以通过在超媒体格式本身中定义对方法的限制来解决一些问题。这是将相同信息传达给任何可以使用相关媒体类型的组件的不同方式。

但至少还有两个额外的考虑因素。首先,链接中的信息只有知道该媒体类型的组件才能理解。在 Web 上,大多数组件与媒体类型无关——缓存 html 看起来就像缓存 json 看起来像缓存 jpeg。

其次,链接中的信息仅在出站端可用。REST 意味着无状态 - 处理请求所需的所有信息都包含在请求中。这意味着请求中必须包含处理通信故障所需的所有信息。

例如,http 规范定义了idempotent

如果使用该方法的多个相同请求对服务器的预期效果与单个此类请求的效果相同,则该请求方法被认为是“幂等的”。

当中间组件沿着不可靠转发请求并且没有收到来自服务器的响应时,此属性对于中间组件很重要。我们无法知道消息是否丢失,或者只是缓慢,我们无法区分丢失的请求消息和丢失的响应消息。

如果请求包含幂等的信息,那么中介知道他们可以将消息重新发送到服务器,而不是向客户端报告错误。

将此与在 http 中正确处理 POST 进行对比;由于 POST 请求上没有幂等标记,因此组件不知道重新发送消息会产生预期的效果(这就是为什么如果您尝试 POST 两次表单,Web 浏览器通常会显示警告)。

将自己锁定在单一方法中会给您一个选择;你想支持中介的错误恢复吗?或者你想要支持非幂等写入的灵活性?

于 2016-08-04T16:08:08.440 回答