16

在我的 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 调用应该是幂等的,而我上面的实现不遵守该规则。另一方面,我不确定是否可以发出带有空消息正文的 HTTP POST 请求。

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

4

4 回答 4

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

所以问题不在于返回的数据。相反,它是服务器状态:因此,如果您将此值存储在服务器上,这会导致状态发生变化,那么它不适合 GET。否则如果是返回的数据就好了。如果相隔 10 分钟调用http://stackoverflow.com ,则会返回不同的数据。

让我们看另一个例子,一个返回当前时间的时钟服务。每次调用时,都会得到不同的值,但调用本身不会导致服务器上的状态发生变化,因为时钟状态是单独维护的。所以在这里使用 GET 是一个不错的选择。

于 2013-10-09T08:04:49.110 回答
11

HTTP 中绝对没有任何内容禁止使用带有空正文的 POST。

此外,消息还带有一种表示形式,即正文+标头。在您的情况下,正文是 0 长度,这很好,并且标头可以识别用户。

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

于 2013-10-09T07:55:41.903 回答
5

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

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

于 2013-10-13T04:12:13.117 回答
1

您应该POST在这种情况下使用,因为通过设计,GET可以缓存调用。关于空的帖子正文,没有问题。类似的场景也在讨论:POST with empty body,其中一篇文章提到:

没有 content-length 和 body 的 POST 等效于 Content-Length: 0 并且没有任何后续的 POST,例如,当您上传一个空文件时,这完全可能发生。资源由 URL 确定,服务器必须知道如何处理正文,包括它是否为空。实际上,我在这里看不到问题:-/

威利

于 2013-10-09T10:30:21.713 回答