在Rest Services中,当我们想要从服务器检索一些数据时,我们通常会使用'GET'请求,但我们也可以使用'POST'请求检索数据。 我们使用'POST'创建,'PUT'更新,'DELETE'删除,但我们甚至可以使用'DELETE'请求创建新数据。
所以我只是想知道背后的真正原因是什么,为什么要使用这些约定?
答案 0 :(得分:2)
所以我只是想知道背后的真正原因是什么,为什么要使用这些约定?
所以世界不会崩溃!
不,但严重的是,为什么创建了任何协议或标准?采取这种历史情景。早在谷歌的早期,许多开发人员(相对于现在)对HTTP协议并不太了解。您可能会遇到的是一堆网站,他们只使用了众所周知的(可能仅 已知)GET方法。因此会有链接作为GET请求,但会执行意味着POST请求的操作,这将改变服务器的状态(有时非常重要的状态更改)。进入谷歌,他花了几天时间抓取网络。因此,现在您拥有Google正在抓取的所有这些链接,所有这些链接都是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。我会保留以下文档。阅读一次,然后将其作为参考
答案 1 :(得分:0)
由代理POST缓存而不是DELETE!
是的,您可以使用GET创建数据,但现在您必须销毁该缓存。为什么要做额外的工作。
由于使用目的,接受的最大标头大小也不同。
答案 2 :(得分:0)
我建议阅读spec,它清楚地说明应该如何使用每个http方法。
为什么要使用这些约定?
它们是惯例,即已被采纳为标准的最佳实践。您不必遵守标准,但Illegal instruction (core dumped)
服务的大多数消费者都会假设您这样做。这样就更容易理解实现/接口。