RESTful API:删除实体 - 我应该返回什么结果?

时间:2018-06-11 07:32:11

标签: rest api

我正在实现一个RESTful API,一个控制器的端点是Delete。 Delete根据要删除的实体执行两个操作:它更新实体或从数据库中删除实体。如果删除更新实体,我将发送HttpStatus 200和更新的实体。但是如果删除从数据库中删除实体,我只会发送HttpStatus 200。在一个案例中,我正在返回一个对象。但在另一种情况下,该对象不再存在。这是一个好方法还是我错过了什么?

2 个答案:

答案 0 :(得分:2)

DELETE通常考虑的HTTP状态包括:

如果您的服务没有返回任何其他信息,

204是理想的选择。它也适用于PUT更新请求。许多服务返回204,包括Docker,如下所示:

但是,如果您要实施HATEOAS,最好使用200 OK并为服务提供一些链接。想想刚刚发布删除并需要将用户导航到某个位置的应用程序。如果不提供该位置的URL,则客户端应用程序需要保持状态。提供带有链接的200 OK允许REST API为客户端保持状态。

以下文章很好地描述了这个问题(请阅读博客以获得更多讨论):

  

如果您正在构建HATEOAS应用程序,请避免204回复。

     

这是关于REST API设计的一课,我在构建非平凡的REST API时学到了这一点。为了尽可能支持客户端,REST API不应返回204(无内容)响应。

     

从服务的角度来看,204(无内容)响应可能是对POST,PUT或DELETE请求的完全有效的响应。特别是,对于DELETE请求,这似乎非常合适,因为您还能说什么呢?

     

但是,从适当的HATEOAS感知客户端的角度来看,204响应是有问题的,因为没有要遵循的链接。当超媒体充当应用程序状态的引擎时,当没有链接时,就没有状态。换句话说,204响应会抛弃所有应用程序状态。

     

如果客户端遇到204响应,它可以放弃,转到API的入口点,或者返回到它访问的先前资源。这两种选择都不是特别好。

答案 1 :(得分:1)

简短回答

成功的DELETE请求的合适的状态代码为200202204

答案很长

  

import { Keyboard } from '@ionic-native/keyboard'; constructor(private keyboard: Keyboard) { } scrollStart() { this.keyboard.close(); } 根据要删除的实体执行两个操作:它更新实体或从数据库中删除实体。 [...]这是一个好方法还是我错过了什么?

DELETE方法不适用于执行更新。

请参阅RFC 7231中的以下引用,其中一个文档是定义HTTP / 1.1协议的,有关DELETE方法的详细信息:

  

4.3.5. DELETE

     

DELETE方法请求原始服务器删除   目标资源与其当前之间的关联   功能。实际上,此方法类似于DELETE命令   在UNIX中:它表示对URI映射的删除操作   原始服务器而不是以前的期望   相关信息将被删除。 [...]

如果删除操作成功,则服务器可以返回以下状态代码之一:

  • 202:表示已接受请求进行处理,但处理尚未完成。
  • 204:表示服务器有 成功完成了请求,并且没有其他要求 要在响应有效负载主体中发送的内容。
  • 200:表示请求已成功,请求有效负载包含操作状态的表示。

请参阅同一文件中的以下引文:

  

如果成功应用rm方法,原始服务器应该应该   如果操作可能成功,则发送DELETE(已接受)状态代码   但尚未颁布,如果是202(无内容)状态代码   行动已经颁布,不再提供进一步的信息,   或者204(OK)状态代码(如果已执行该操作)   响应消息包括描述状态的表示。