首页 > 解决方案 > REST:创建基于 Json 的查询:使用哪种 http 方法?

问题描述

我对 RESTful 服务有疑问。在 REST 中,POST 方法用于创建实体。GET 用于查询实体。正确的?

正如我在另一篇文章中所读到的,HTTP 中不允许发送带有正文的 GET 请求。但是当我想发送 Json 进行查询时,最好的方法是什么?是否有任何最佳实践或如何解决此类 json 查询?

感谢您的回答

标签: jsonresthttp

解决方案


在 REST 中,POST 方法用于创建实体。GET 用于查询实体。正确的?

并不真地。 GET用于获取资源的表示。 POST故意含糊不清——任何不值得标准化的东西都可以使用 POST。

当我想发送 Json 进行查询时,最好的方法是什么?

没有最好的办法,只能取舍。

HTTP 的基本情节是您获取资源的表示。如果您想要的资源不存在,则创建一个新资源。因此,“REST”流程看起来类似于向服务器发送请求以创建“我的查询的答案”资源,然后使用 GET 获取该资源的当前表示。这很好,因为我们可以在担心副本过期的任何时候获取该资源的最新表示。具有相同查询的其他人可以使用相同的资源,因此我们可以使用通用缓存来承担很多工作。最终结果是“网络规模”。

好吧,不是很好,因为我们了解到通过不安全的渠道发送信息是个坏主意;但是我们可以在我们的服务器前面放置一个通用缓存代理,并通过这种方式获得一定的规模。

但是,当您只希望查询一次时,“创建一个新资源”是很多仪式。

在这种情况下创建新资源无论如何都要使用 POST,那么为什么不立即返回解决方案的表示呢?答案是,继续前进!效果很好......但根本没有给你任何缓存支持。您正在以修改资源的名义有效地执行远程调用。

此外,POST 不承诺幂等语义——在不可靠的网络上,请求可能会丢失,通用组件不会知道在这种特殊情况下重复相同的请求是无害的。

PUT 具有幂等语义......但它也对与“查询”完全不匹配的有效负载内容有非常具体的意见。

您可以挖掘其他标准化方法,但实际上并没有任何合适的方法。唯一接近的方法是 SEARCH 和 REPORT,它们与 WebDAV 语义耦合。

您可以发明自己的非标准方法;但通用组件不会理解它。

您可以使用您需要的语义标准化一种新方法,但这需要大量工作。

或者你可以只使用 POST

请记住,Web 仅使用 GET 和 POST 就占领了世界。所以应该没问题。


推荐阅读