用于软删除和恢复软删除资源的 REST 是有限的
REST for soft delete and recovering soft deleted resources is limited
这不是一个技术问题,而是对这个主题的反思。
REST 已经民主化了一种使用 HTTP 协议提供资源的好方法,并让开发人员通过拆分资源和用户界面来完成最干净的项目(后端现在真正处理后端只使用 REST APIs).
关于那些 API,大多数时候我们使用 GET、PUT/PATCH(嗯?)、POST 和 DELETE,它们都模仿 CRUD 数据库。
但是随着在我们项目上花费的时间的推移,我们觉得可以通过添加大量强大的功能来改进用户体验。例如,为什么用户应该害怕删除资源?为什么不只放置一个恢复系统(就像我们在 Google Keep 应用程序中看到的那样,让我们撤消删除,我认为这在用户体验方面很棒)。
防止意外删除的一种做法是在 table 中使用代表资源的列。例如,我要删除一本书,所以通过单击删除按钮,我只会在我的数据库中将该行标记为 "deleted = TRUE",并防止在浏览资源列表时显示被删除的行 (GET) .
这最后一个与我们亲爱的 REST 模式相冲突,因为 DELETE 和 DESTROY 之间没有区别 "methods"。
我的意思是,我们是否应该考虑让 REST 发展以满足我们的 UX 需求,所以我的意思是让 HTTP 协议也在发展,或者这应该作为一种纯粹的资源管理而我们应该遵循 HTTP 协议而不是试图打扰它并使用解决方法适应它(比如使用 PATCH 进行软删除)?
我个人希望看到至少 4 个新协议,因为我们正在努力使资源尽可能好:
- DELETE成为一种防止其他方法对其产生影响的方法
- DESTROY 通过完全删除此资源的踪迹变得更加引人注目
- RECOVER是对其他方法的一种说法"hey guys, he is coming back, stay tuned"
- TRASH 类似于 GET,但仅适用于 DELETED 资源
让我想到它的是我对处理这种资源行为的干净 REST 解决方案的研究。我看过一些网站帖子,包括
- https://www.pandastrike.com/posts/20161004-soft-deletes-http-api
- https://philsturgeon.uk/rest/2014/05/25/restful-deletions-restorations-and-revisions/
- ...
这建议我们使用 PUT 或 PATCH 来使软删除变得可用,但我觉得这听起来不太对,不是吗?
我对这个问题的看法:
- 在提出新的 HTTP 方法和更新以前的方法之间有很大的进步吗(我听说 HTTP/2 是个问题,也许我们可以把它们装进去?)
- 它在网络开发领域之外是否有意义?我的意思是,此更改是否会影响我们的其他域?
即使在网络开发领域,我也不确定这是否有意义;起始前提似乎是错误的。
RFC 7231 为 POST
提供了此解释
The POST method requests that the target resource process the representation enclosed in the request according to the resource's own specific semantics.
谜语:如果这是POST的官方定义,为什么我们需要GET?目标可以用 GET 做的任何事情也可以用 POST.
完成
答案是 GET 的额外限制允许参与者仅使用消息中包含的 信息做出明智的决定。
例如,因为头数据通知中间组件方法是GET,中间组件知道收到消息后的动作是safe,所以如果响应丢失,可以重复消息.
爬网的整个概念取决于您可以跟随任何安全 link 发现新资源这一事实。
浏览器可以预取表示,因为 link 中编码的信息告诉它这样做的消息是安全的。
Jim Webber 描述它的方式:“HTTP 是一个应用程序,但它不是您的 应用程序”。 HTTP 规范所做的是定义 消息 的语义,以便通用服务器可以理解通用客户端。
使用你的例子; API 消费者可能关心 delete 和 destroy 之间的区别,但 browser 不关心;浏览器只想知道发送什么消息,重试规则是什么,缓存规则是什么,如何对各种错误情况做出反应等等。
这就是 REST 的强大之处——您可以使用任何 理解表示的媒体类型的浏览器,并获得正确的行为,即使浏览器完全不知道应用程序语义。
浏览器不知道它正在与 Internet 留言板或路由器的控制面板对话。
总而言之:在我看来,您的想法好像是在尝试通过更改消息传递语义来实现更丰富的应用程序语义;这违反了关注点分离。
这不是一个技术问题,而是对这个主题的反思。
REST 已经民主化了一种使用 HTTP 协议提供资源的好方法,并让开发人员通过拆分资源和用户界面来完成最干净的项目(后端现在真正处理后端只使用 REST APIs).
关于那些 API,大多数时候我们使用 GET、PUT/PATCH(嗯?)、POST 和 DELETE,它们都模仿 CRUD 数据库。
但是随着在我们项目上花费的时间的推移,我们觉得可以通过添加大量强大的功能来改进用户体验。例如,为什么用户应该害怕删除资源?为什么不只放置一个恢复系统(就像我们在 Google Keep 应用程序中看到的那样,让我们撤消删除,我认为这在用户体验方面很棒)。
防止意外删除的一种做法是在 table 中使用代表资源的列。例如,我要删除一本书,所以通过单击删除按钮,我只会在我的数据库中将该行标记为 "deleted = TRUE",并防止在浏览资源列表时显示被删除的行 (GET) .
这最后一个与我们亲爱的 REST 模式相冲突,因为 DELETE 和 DESTROY 之间没有区别 "methods"。
我的意思是,我们是否应该考虑让 REST 发展以满足我们的 UX 需求,所以我的意思是让 HTTP 协议也在发展,或者这应该作为一种纯粹的资源管理而我们应该遵循 HTTP 协议而不是试图打扰它并使用解决方法适应它(比如使用 PATCH 进行软删除)?
我个人希望看到至少 4 个新协议,因为我们正在努力使资源尽可能好:
- DELETE成为一种防止其他方法对其产生影响的方法
- DESTROY 通过完全删除此资源的踪迹变得更加引人注目
- RECOVER是对其他方法的一种说法"hey guys, he is coming back, stay tuned"
- TRASH 类似于 GET,但仅适用于 DELETED 资源
让我想到它的是我对处理这种资源行为的干净 REST 解决方案的研究。我看过一些网站帖子,包括
- https://www.pandastrike.com/posts/20161004-soft-deletes-http-api
- https://philsturgeon.uk/rest/2014/05/25/restful-deletions-restorations-and-revisions/
- ...
这建议我们使用 PUT 或 PATCH 来使软删除变得可用,但我觉得这听起来不太对,不是吗?
我对这个问题的看法:
- 在提出新的 HTTP 方法和更新以前的方法之间有很大的进步吗(我听说 HTTP/2 是个问题,也许我们可以把它们装进去?)
- 它在网络开发领域之外是否有意义?我的意思是,此更改是否会影响我们的其他域?
即使在网络开发领域,我也不确定这是否有意义;起始前提似乎是错误的。
RFC 7231 为 POST
提供了此解释The POST method requests that the target resource process the representation enclosed in the request according to the resource's own specific semantics.
谜语:如果这是POST的官方定义,为什么我们需要GET?目标可以用 GET 做的任何事情也可以用 POST.
完成答案是 GET 的额外限制允许参与者仅使用消息中包含的 信息做出明智的决定。
例如,因为头数据通知中间组件方法是GET,中间组件知道收到消息后的动作是safe,所以如果响应丢失,可以重复消息.
爬网的整个概念取决于您可以跟随任何安全 link 发现新资源这一事实。
浏览器可以预取表示,因为 link 中编码的信息告诉它这样做的消息是安全的。
Jim Webber 描述它的方式:“HTTP 是一个应用程序,但它不是您的 应用程序”。 HTTP 规范所做的是定义 消息 的语义,以便通用服务器可以理解通用客户端。
使用你的例子; API 消费者可能关心 delete 和 destroy 之间的区别,但 browser 不关心;浏览器只想知道发送什么消息,重试规则是什么,缓存规则是什么,如何对各种错误情况做出反应等等。
这就是 REST 的强大之处——您可以使用任何 理解表示的媒体类型的浏览器,并获得正确的行为,即使浏览器完全不知道应用程序语义。
浏览器不知道它正在与 Internet 留言板或路由器的控制面板对话。
总而言之:在我看来,您的想法好像是在尝试通过更改消息传递语义来实现更丰富的应用程序语义;这违反了关注点分离。