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

清空HTTP POST请求或GET请求以通过HTTP API生成随机值,http,rest,web,asp.net-web-api,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 Con

在我的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 POST请求。


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

HTTP中绝对没有禁止使用带有空正文的POST

此外,消息带有一个表示,即body+头。在本例中,body的长度为0,这很好,而header则标识用户

请参见此处的讨论-

  • Safe=>调用是否导致服务器上的状态更改
  • 幂等=>多个调用是否会在服务器上导致相同的更改
因此,问题不在于返回的数据。相反,它是服务器状态:因此,如果您将此值存储在服务器上,这将导致状态发生更改,那么它不适合GET。否则,如果返回的是数据,则可以。如果相隔10分钟调用,则调用返回不同的数据


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

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

一篇没有内容长度和正文的文章相当于一篇内容长度为0且没有任何后续内容的文章,例如,当您上传一个空文件时,可能会发生这种情况。资源由URL决定,服务器必须知道如何处理主体,包括主体是否为空。事实上,我不认为这里有什么问题:-/

威利


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


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

对不起,我说的是GET by混淆!还有一个问题是服务器状态,这里没有提到,这是关键。我认为OP很清楚他不应该使用GET-here,所以我试图解释为什么他也不应该害怕使用POST-insteaddMe。如果随机数是在内存中生成的,并且不是会产生副作用的现有资源的一部分,那么GET是完全正确的。我们不是说创建一个与服务器状态无关的值。据我所知,生成的票证将与用户关联,因此有效地创建了一个新资源(“用户票证”资源)。这就是为什么我不相信时钟服务也是一个很好的类比。创建资源!=将值存储在server@FilipW我没有说存储值。它正在改变状态。谢谢大家。这个答案更具描述性,消除了我的所有困惑。你说“如果你在服务器上存储这个值,那么它不适合GET。”“GET调用可以缓存”,这是正确的,但取决于你想要实现的数据一致性,即服务器上数据更改的频率。因此,您可能还有一些GET请求不允许缓存。此外,请考虑也不能缓存的经过身份验证的数据。因此,您的缓存参数不完全适合此处。您可以返回适当的缓存头。