我正在实现一个用于设置和检索资源的REST API。
我最初的实施非常简单:
1)PUT - path指定要存储的{id},请求body是要存储的JSON对象,成功时返回200响应
2)GET - path指定要检索的{id},请求body为空,返回200响应以及正文中存储的JSON对象
3)DELETE - path指定要删除的{id},请求正文为空,返回200和空体(是的,可能应该是204)
然而,比我更具影响力的上游派对要求我们对JSON对象进行破坏性检索。他们坚持认为他们不想做出单独的GET和DELETE调用的麻烦(也就是说,它确实与那些试图确保原子调用以消除竞争条件的人无关。)
对我而言,这似乎违反了RESTful服务的精神,当我尝试记录此更改时,API文档具有明确的“代码味道”,因为在尝试清楚地记录GET / DELETE方法时感觉很尴尬
显然,我可以实施任何有效的工作,但是在破坏性读取方面是否存在完善的惯例?当然有些情况下确实需要进行原子通话?
答案 0 :(得分:1)
他们所要求的与REST无关,但它与HTTP RFC(#7231)相反。
如果成功应用DELETE方法,则为原始服务器 如果可能采取行动,应该发送202(已接受)状态代码 成功但尚未颁布,204(无内容)状态 代码,如果该行动已经颁布,没有进一步的信息 如果已提供,则提供,或200(OK)状态代码 制定并且响应消息包括表示 描述状态。
这很清楚。您可以返回200 (Ok)
,但响应中的实体应该是状态对象,而不是已删除的对象。当然,无论如何,你可能会被欺负,办公室政治就是这样。询问他们为什么需要违反RFC的技术原因。不要接受handwavey“太昂贵”的声明 - 让他们提供证明存在问题的实际测试用例。
对于原子读取/删除操作,我没有定义的语义。在没有更多信息的情况下,很难建议您如何继续进行,这可能超出了本网站的范围。