这个问题的用例是我正在为Google App Engine编写的Java应用程序。我向Servlet发送请求,但要发送回客户端的数据将通过Channel API socket传输而不是在HTTP响应中传输。目前,我的客户端发送一个没有请求体内容的POST请求,并等待来自Servlet的204响应,然后轮询Channel API socket。因为请求体中没有发送任何数据,所以我正在考虑是否更有意义发送GET而不是POST。
我在使用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
服务器已经满足请求但不需要返回实体正文,并且可能希望返回更新的元信息。响应中可以包含新的或更新的元信息,以实体标头的形式提供,如果存在,则应与请求变量相关联。
根据RFC 2616状态码204的规范,我认为对于一个GET请求来说,这是一个有效的选择。
404 Not Found
、200 OK
空正文和204 No Content
三种状态码完全不同,有时我们不能使用正确的状态码,但是“弯曲规则”会让你在未来某一天付出代价。所以,如果可以使用正确的状态码,就请使用它!
我认为选择GET还是POST是非常个人化的,因为两者都能够完成工作,但我建议您保留POST而不是GET,有以下两个原因:
您目前的POST和HTTP 204响应的组合是可以的。
使用POST作为GET的通用替代方式不受RFC支持,因为每个请求都有自己特定的目的和语义。
GET的目的是检索资源。因此,虽然允许使用HTTP 204响应,但这不是最佳选择,因为响应中期望包含内容。如果服务器无法提供所请求的资源,则HTTP 404未找到或HTTP 410已删除将是更好的选择。
RFC还明确指出了HTTP 204作为PUT、POST和DELETE的适当响应,但在GET中省略了它。
请参阅RFC以获取GET的语义。
还有其他可以返回没有内容的响应代码,比HTTP 204更合适。
例如,对于条件GET,您可以收到一个HTTP 304未修改的响应,其中不包含正文内容。
POST/GET与204一起使用看起来很好,并且也能够正常工作。
文档说明: 2xx--这类状态代码表示服务器已成功接收、理解、接受并处理了客户端请求的操作,而 4xx-- 4xx状态代码用于客户端似乎出现错误的情况。
由于在服务器上成功地接收、理解和处理了请求。结果是资源未找到。因此,在这种情况下,这不是客户端错误或客户端犯了错误。
因此,应该是2xx系列的代码,而不是4xx。在这种情况下,发送204(无内容)比404或410响应更好。
返回204的Http GET是完全可以接受的,返回404也同样可以。
重要的是您为API定义设计标准/指南,以便所有终端点都一致地使用状态码。
例如:
GET /complaints/year/2019/month/04
将返回204。这不是客户端错误,因此我们返回成功状态码(204)。另一方面,如果投诉编号12345不存在,则GET /complaints/12345
可能返回404。