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

问题描述 投票:36回答:4

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

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

google-app-engine http get http-status-codes channel-api
4个回答
44
投票

204 No Content

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

根据RFC part for the status code 204,在我看来,GET请求是一个有效的选择。

一个404 Not Found200 OK与空体和204 No Content有完全不同的含义,有时我们不能使用正确的状态代码,但弯曲规则,他们会回来咬你一天或更晚。因此,如果您可以使用正确的状态代码,请使用它!

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

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

15
投票

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

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

GET的目的是检索资源。因此,虽然允许,但HTTP 204不是最佳选择,因为响应中预期内容IS。如果服务器无法提供所请求的资源,那么HTTP 404 Not FoundHTTP 410 Gone将是更好的选择。

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

RFC for the semantics of GET

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

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


10
投票

我使用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

5
投票

204的POST / GET在第一眼看上去似乎很好,也会起作用。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.