REST Web服务中的GET与POST

时间:2013-04-16 20:56:56

标签: rest

我正在开发一项REST服务,允许用户根据发票上显示的几条信息(发票号和帐单邮编)索取其列表。

我读过无数篇文章和Stack Overflow关于何时使用GET以及何时使用POST的问题。总的来说,共同的共识是GET应该用于幂等操作,POST应该用于在服务器端创建某些东西的操作。但是,这篇文章:

http://blog.teamtreehouse.com/the-definitive-guide-to-get-vs-post

让我对这个特定场景使用GET提出质疑,仅仅是因为我使用这两个信息作为验证用户身份的机制。我没有使用此特定方法调用更新服务器上的任何内容,但我也不一定要在URL中公开信息。

这是一个内部Web服务,只有调用该服务的前端是公开的,因此我不必担心在用户的浏览器历史记录中显示的URL。我唯一担心的是有人获得服务器日志访问的不太可能的事件,在这种情况下,我会遇到更大的问题。

出于安全考虑,我倾向于POST;然而,由于请求是幂等的,因此GET感觉就像是正确的方法。在这种情况下推荐的方法是什么?

3 个答案:

答案 0 :(得分:5)

独立于POST与GET,我建议不要将您的安全性作为简单的邮政编码和发票编号。我敢打赌,发票号码是连续的(或关闭),并且周围没有那么多的邮政编码 - 瞧,我可以完全访问你的列表。

如果您正在使用其他身份验证方法(通常在HTTP标头中),那么您就是好的 - 如果您有一个发票号码,那么无关紧要,因此也可以使用GET。

如果你不是,那么我认为在暴露机密内容方面,POST并不像GET那么糟糕。

答案 1 :(得分:0)

POST与GET之间没有任何增加的安全性。当然,请求不在URL中,但是我们在这里谈论的是REST,无论如何人们都看不到URL。

答案 2 :(得分:0)

你的问题从一些不好的假设开始。首先,GET不仅适用于任何旧的幂等操作,而是来自服务器的GET资源;只是这样做无副作用。其次,URL不是GET请求向服务器发送数据的唯一方式,您可以使用带有GET请求的有效负载(至少就HTTP而言,某些实现是坏的,不要'支持这一点或使其变得困难)。第三,正如所指出的,您选择了一些可怕的数据字段来保护您的访问权限。最后,您正在以任何方式使用纯文本协议,因此这两种方法都没有提供更好的安全性。

您应该使用最能描述您正在做什么的动词,从服务器获取一些信息,因此请使用GET。使用一些适当的安全性,例如基本的HTTPS加密。如果您想避免这些字段“堵塞”URL,您可以在请求的有效负载中发送数据,例如:

GET /listings HTTP/1.1
Content-Type = application/json

{ "zip"     : "IN0N0USZ1PC0D35",
  "invoice" : "54859081145" }