好的POST是一个空体,在响应中传递数据?

时间:2012-02-22 21:21:48

标签: http post

我希望客户端能够(通过HTTP)请求服务器输出队列头部的任何文档,并了解如果检索成功,文档将自动从队列中删除。每台服务器永远不会有多个客户端,但客户端可能是多线程的。没有随机访问队列;只能检索(并删除)头项目。我没有在这里或网上的其他地方发现这个场景。以下是我能想到的各种方法:

(1)客户端可以发送GET请求。但GET不应该有副作用,所以这似乎不是一个好主意。

(2)客户端可以发送两个请求,一个GET来检索队列头部的文档和一个DELETE(带有空或可忽略的URL)来删除队列头部的文档。但这需要两次调用,这可能会导致各种问题,特别是如果客户端中有多个线程/进程正在尝试检索文件。

(3)客户端可以发送一个空主体的POST请求;如果队列头部有文档,服务器将返回其正文包含文档的响应,并且还将从队列中删除该文档。这有点违反直觉,因为它与发布数据和接收简单返回代码的心理模型不匹配,但我喜欢它。我并不担心在运输过程中丢失的反应和文件丢失;我希望连接足够安全以防止这种情况发生。

如果有另一种HTTP方法来处理这种情况会很好,但由于没有,我认为(3)是最好的方法。同意?不同意?

更新:在阅读下面的Dan675帖子后添加(4)。

(4)客户端可以发送DELETE请求,服务器可以向该请求发送包含正文中文档的响应(当然,从队列中删除文档)。再一次,这有点违反直觉(你通常不会说“当我想要检索它时,请删除堆栈顶部的项目”,但是可以使用它。)

1 个答案:

答案 0 :(得分:1)

它应该在两个调用中完成,第一个是GET,然后是一个删除它。

如果删除成功,则客户端请求有效,否则只需将其视为整个请求失败并尝试再次获取队列顶部的内容。由于请求失败,这将导致一些额外的开销,但我不建议您执行其他任何选项。

我想另一种方法是首先做一个PUT,以某种方式将最顶层的项目标记为“保留”,然后执行GET和DELETE。通过这种方式,可以遍历此服务器端队列并查找不是“保留”的最顶层项目。