【问题标题】:Rest Services conventions休息服务约定
【发布时间】:2015-06-13 07:46:05
【问题描述】:

在 Rest Services 中,当我们想从服务器检索一些数据时,我们通常使用“GET”请求,但是我们也可以使用“POST”请求来检索数据。 我们使用“POST”来创建,“PUT”来更新,“DELETE”来删除,但是我们甚至可以使用“DELETE”请求来创建新数据。

所以我只是想知道这背后的真正原因是什么,为什么要使用这些约定?

【问题讨论】:

  • HTTP 规范提供了关于何时以及如何使用每种 HTTP 方法和响应代码的建议。由于此协议不限制使用,因为这是特定于域的,您实际上可以通过GET 创建数据,但也可以通过DELETE 检索数据。如果你实施 f.e.因此,返回实体 vie DELETE 的恢复队列可能是有意义的。此外,REST 应该是不言自明的——但是,如果您自定义 HTTP 操作,您将失去这些语义,因此需要提供明确的文档(这与 REST 原则背道而驰)。

标签: rest resteasy


【解决方案1】:

所以我只是想知道背后的真正原因是什么,为什么要使用这些约定?

所以世界不会分崩离析!

不,但说真的,为什么要创建任何协议或标准?以这个历史场景为例。回到 Google 的早期,许多开发人员(相对于现在)对 HTTP 协议并不太了解。您可能已经发现了一堆刚刚使用众所周知的(也许只有知道的)GET 方法的网站。所以会有一些链接是 GET 请求,但会执行原本是 POST 请求的操作,这会改变服务器的状态(有时非常重要的状态变化)。进入谷歌,它每天都在爬网。所以现在你有了谷歌正在抓取的所有这些链接,所有这些链接都是 GET 请求,但会改变服务器的状态。所以所有这些公司都在他们的服务器改变状态上获得了很多点击。他们都认为自己受到了攻击!但谷歌并没有做错任何事。 HTTP 语义声明 GET 请求不应具有状态更改行为。它应该是“只读”方法。所以最后这些公司变聪明了,开始遵循 HTTP 语义。真实的故事。

故事的寓意:遵循协议,这就是它们的目的 - 遵循。

您似乎是从服务器实现的角度来看待它。是的,您可以实现您的服务器以接受 DELETE 请求以“获取”某些内容。这不是手头的问题。在实现服务器时,您需要考虑客户端的期望。我的意思是最终,您正在创建一个 API。从代码API的角度来看

public class Foo {

    public Bar bar;

    public Bar deleteBar() {  
        return bar;            // Really?!
    }

    public void getBar() {  
        bar = null;            // What the..??!
    }
}

我不知道开发人员会在游戏中坚持多久,编写这样的代码。任何期望“得到”Bar(仅通过命名语义)的调用者都会有另一件事发生。您的 REST 服务也是如此。它最终是一个 WEB API,应该遵循它所构建的协议(即 HTTP)的语义。那些了解该协议的人将了解 API 的作用(至少在 CRUD 意义上),仅基于他们发出的请求类型。

我对您或任何尝试学习 REST 的人的建议是掌握 HTTP。我会随身携带以下文件。读一遍,留作参考

【讨论】:

【解决方案2】:

GET 被代理缓存 POST 而不是 DELETE!

是的,您可以使用 GET 创建数据,但现在您必须销毁该缓存。为什么要做额外的工作。

由于使用目的,接受的最大标头大小也不同。

【讨论】:

  • 如果使用自定义服务器和/或客户端实现,可能根本没有任何缓存。因此,您的回答颇具推测性。
【解决方案3】:

我建议阅读spec,它清楚地说明了每个 http 方法应该如何使用。

为什么使用这些约定?

它们是约定,即已作为标准采用的最佳做法。您不必遵守标准,但REST 服务的大多数消费者都认为您这样做。这样更容易理解实现/接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2015-03-15
    • 2012-06-29
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多