HTTP获取204无内容:这是正常的

ecb*_*die 42 google-app-engine get http http-status-codes channel-api

HTTP GET请求是否正常出现响应状态代码204 - No Content?就像,这对于HTTP GET应该完成的内容来说,这在语义上是否正确?我知道一个HTTP POST请求204 - No Content可以的.对于GET请求,如果没有数据要发回,204状态代码是否合适?我应该使用404,还是仅仅坚持200以获得成功但是空洞的回答?

此问题的用例是我为Google App Engine编写的Java应用程序.我正在向servlet发送请求,但要发送回客户端的数据将通过Channel API套接字而不是HTTP Response传输.目前,我的客户端在请求正文中发送没有内容的POST,并在轮询Channel API套接字之前等待来自servlet的204响应.因为我没有在请求正文中发送数据,所以我在辩论发送GET而不是POST是否更有意义.

Sat*_*vis 46

204没有内容

服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息.响应可以包括实体标题形式的新的或更新的元信息,如果存在,应该与所请求的变体相关联.

根据状态代码204RFC部分,在我看来,它是GET请求的有效选择.

A 404 Not Found,200 OK空体并且204 No Content具有完全不同的含义,有时我们不能使用正确的状态代码而是弯曲规则,他们会在一天或更晚的时候回来咬你.因此,如果您可以使用正确的状态代码,请使用它!

我认为GET或POST的选择非常个人化,因为他们都会做这项工作,但我建议你保留POST而不是GET,原因有二:

  • 您希望其他部分(如果我理解正确的话,servlet)执行操作而不从中检索某些数据.
  • 默认情况下,如果URL中没有参数,则GET请求是可缓存的,而POST则不是.

  • 我不知道GET是可缓存的而POST不是; 要学习的好信息.谢谢. (3认同)
  • @ecbrodie 不客气,您可以在[此处]找到有关 GET 和 POST 请求缓存的更多信息(http://tools.ietf.org/html/rfc2616#section-9.3) (2认同)

Ste*_*ell 18

我使用GET/204和RESTful集合,这是一个已知固定长度但带孔的位置数组.

GET /items
    200: ["a", "b", null]

GET /items/0
    200: "a"

GET /items/1
    200: "b"

GET /items/2
    204:

GET /items/3
    404: Not Found
Run Code Online (Sandbox Code Playgroud)

  • 我只是想说你的例子非常简洁.做得好. (4认同)

Rus*_*son 16

您当前的POST与HTTP 204响应的组合很好.

RFC不支持使用POST作为GET的通用替代,因为每个都有自己的特定用途和语义.

GET的目的是检索资源.因此,虽然允许,但HTTP 204不是最佳选择,因为响应中预期内容IS.一个HTTP 404未找到HTTP 410飘如果服务器无法提供所请求的资源将是更好的选择.

RFC还专门调用HTTP 204作为PUT,POST和DELETE的适当响应,但是为GET省略了它.

有关GET的语义,请参阅RFC.

还有其他响应代码也可以返回,表示没有内容,这比HTTP 204更合适.

例如,对于条件GET,您可以接收包含正文内容的HTTP 304 Not Modified响应.


ios*_*tor 5

带有204的POST / GET乍一看似乎还不错,并且也可以使用。

文档说,2xx -此类状态代码表示已成功接收,理解,接受和处理了客户请求的操作。而4xx-状态代码的4xx类适用于客户端似乎已出错的情况。

从此,请求已在服务器上成功接收,理解和处理。结果是找不到资源。因此,在这种情况下,这不是客户端错误或客户端没有出错。

因此,这应该是2xx系列代码,而不是4xx。在这种情况下,发送204(无内容)会比404或410响应更好。