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。
204 No Content
服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息。响应可以包括实体标题形式的新的或更新的元信息,如果存在,应该与所请求的变体相关联。
根据RFC part for the status code 204,在我看来,GET请求是一个有效的选择。
一个404 Not Found
,200 OK
与空体和204 No Content
有完全不同的含义,有时我们不能使用正确的状态代码,但弯曲规则,他们会回来咬你一天或更晚。因此,如果您可以使用正确的状态代码,请使用它!
我认为GET或POST的选择是非常个人化的,因为他们都会做这项工作,但我建议你保留POST而不是GET,原因有两个:
您当前的POST与HTTP 204响应的组合很好。
RFC不支持使用POST作为GET的通用替代,因为每个都有自己的特定用途和语义。
GET的目的是检索资源。因此,虽然允许,但HTTP 204不是最佳选择,因为响应中预期内容IS。如果服务器无法提供所请求的资源,那么HTTP 404 Not Found或HTTP 410 Gone将是更好的选择。
RFC还专门调用HTTP 204作为PUT,POST和DELETE的适当响应,但是为GET省略了它。
见RFC for the semantics of GET。
还有其他响应代码也可以返回,表示没有内容,这比HTTP 204更合适。
例如,对于条件GET,您可以收到不包含正文内容的HTTP 304 Not Modified响应。
我使用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
204的POST / GET在第一眼看上去似乎很好,也会起作用。
文档说明,2xx - 此类状态代码表示已成功接收,理解,接受和处理客户端请求的操作。而4xx - 4xx类状态代码适用于客户端似乎有错误的情况。
因此,在服务器上成功接收,理解和处理了请求。结果是找不到资源。因此,在这种情况下,这不是客户端的错误或客户端没有错误。
因此,这应该是2xx系列代码,而不是4xx。在这种情况下发送204(无内容)将优于404或410响应。