清空HTTP POST请求或GET请求以通过HTTP API生成随机值

时间:2013-10-09 07:44:39

标签: http rest web asp.net-web-api

在我的HTTP API中,其中一个端点应返回一个随机生成的值,该值将与端点的经过身份验证的调用方关联。目前,我有以下结构:

GET http://example.com/random-ticket HTTP/1.1
Authorization: Basic base64-encoded-basic-auth-value
Accept: application/json
Host: example.com

HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json; charset=utf-8
Date: Thu, 03 Oct 2013 07:25:56 GMT
Content-Length: 59

{"user-ticket":"Pfa42634e-1a2e-4a7d-84b9-2d5c46a8dd81"}

发出GET请求以检索随机值。但是,HTTP GET calls should be idempotent和我上面的实现并不遵守该规则。另一方面,我不确定是否可以使用空邮件正文发出HTTP POST请求。

HTTP书执行此类操作的正确方法是什么?

4 个答案:

答案 0 :(得分:15)

  • 安全=>是否调用导致服务器上的状态更改。
  • Idempotent =>多个调用是否会导致服务器上的相同更改。

所以问题不在于返回的数据。而是它是服务器状态:所以如果你将这个值存储在服务器上,这会导致状态发生变化,那么它就不适合GET。否则,如果它是返回的数据,则没关系。如果相隔10分钟,则呼叫http://stackoverflow.com会返回不同的数据。

让我们看另一个例子,时钟服务,它返回当前时间。每次拨打电话时,您都会获得不同的值,但由于时钟状态是单独维护的,因此呼叫本身不会导致服务器上的状态发生变化。所以在这里使用GET是一个不错的选择。

答案 1 :(得分:11)

HTTP中没有任何内容禁止使用带有空体的POST。

此外,消息带有一个表示,即正文+标题。在你的情况下,正文是0长度,这很好,以及标识用户的标题。

请参阅此处的讨论 - http://lists.w3.org/Archives/Public/ietf-http-wg/2010JulSep/0273.html

答案 2 :(得分:4)

使用GET的随机生成器没有问题,因为没有存储的服务器状态。以同样的方式,你可以有一个接受params的计算器,并在调用GET时添加它们。关于cachable的问题是一个有趣的问题,虽然并不真正适用于随机生成器,因为资源本质上没有缓存。这仍然没有改变它可以以安全/幂等的方式设计的事实。

对于没有正文的POST,甚至在查询字符串中使用params,这很好。关于POST的关键是它可能会导致服务器的更改。它不会保证它会,但你不能认为它不会像GET一样。是否有任何内容被设置,并不会改变可能发生变化的事实。例如,想象一下虚拟资源“\ counter \ increment”。每次POST到它都会导致\ counter递增。我没有发送任何有效负载,但我导致服务器状态发生变化,因此它应该是POST或PUT。

答案 3 :(得分:1)

在这种情况下你应该使用POST因为,通过设计,可以缓存GET个调用。关于空岗位,没有问题。类似的情况也在POST with empty body进行了讨论,其中一篇文章提及:

  

没有内容长度的POST,并且没有正文等同于具有Content-Length的POST:0并且没有任何跟随,例如当您上传空文件时可能完美地发生。资源由URL确定,服务器必须知道如何处理正文,包括它是否为空。我实际上没有看到这个问题: - /

     

威利