REST API 如何在向后端发送请求后更新客户端数据

问题描述 投票:0回答:2

前端/客户端显示项目列表。向后端/ API 发出请求以更改某些项目。例如,添加一项或删除一项。后端成功处理这个请求后,如何将这些变化反映在客户端?

示例:

  • 向后端发送 POST 请求,将新项目添加到列表中。响应正文包含添加的项目。 HTTP 状态代码 201 创建

  • 向后端发出 DELETE 请求,从列表中删除项目。响应正文不包含任何内容。 HTTP 状态代码 204 无内容

解决方案?

  1. 请求成功处理后(客户端收到2xx状态码),将再次从后端获取完整列表。缺点:这意味着我们有两个请求。首先是 POST,然后是 GET。

  2. 在 POST 请求的响应正文中返回完整列表。这看起来很奇怪,因为客户端如何使用 API 会影响 API 的行为。

  3. 客户端在收到后端的 2xx 后自行处理项目的添加或删除。优点:只有一个请求。缺点:如果多个用户对数据进行操作就会出现问题。如何保持一切同步?

在干净的 API 设计方面是否存在处理此问题的通用模式?我注意到,如果您更改数据,很多工具只会发出一个请求。想想 Trello 或类似的东西。

rest backend client
2个回答
0
投票

向后端发送 POST 请求,将新项目添加到列表中。响应正文包含添加的项目。

客户端应使用 POST 响应正文来相应地更新自身。额外的 GET 请求将返回相同的信息,因此没有必要。

请注意,只要客户端不共享公共数据,这种方法就可以正常工作。如果有 多个客户端各自在后端修改共享数据,并且这些更改需要反映在所有客户端中,那么问题和解决方案就更加复杂;客户端和后端需要使用 WebSocket 或服务器发送事件才能将更新推送到每个客户端。


-1
投票

如何保持一切同步?

在休息时,你不需要。每个客户端(可能)都有自己的本地缓存。服务器在其响应中包含标准化缓存元数据,为客户端提供信息更改频率的提示。

缓存失效已标准化,但只有 HTTP 请求经过的缓存才会看到触发请求。因此,除非您的客户端共享缓存(在 HTTPS 的世界中不太可能),否则有人会拥有过时的数据。

当然,服务器仍然拥有权威副本,并且我们有标准化的条件请求,当客户端数据过于陈旧时,它们为我们提供了选择。

后端成功处理此请求后,如何将这些变化反映到客户端?

HTTP 规范中有一部分描述了如何识别 HTTP 消息中的表示形式。包括这段

如果响应具有 Content-Location 标头字段,并且其字段值是对与有效请求 URI 相同的 URI 的引用,则有效负载是由有效请求 URI 标识的资源的表示。

因此

POST /foo
PUT /foo
PATCH /foo
有一种标准化的方式来宣布响应中包含的表示是
/foo

的新表示

据我所知,没有任何标准化的方式来传达副作用;也就是说对其他资源的更改。我们必须依靠缓存失效语义。

在很大程度上,REST 是一堆假装是 Web 浏览器的机器,与假装是 Web 服务器的机器进行通信。

REST 接口旨在高效地进行大粒度超媒体数据传输,针对 Web 的常见情况进行优化,但导致接口对于其他形式的架构交互来说并不是最佳的。 -- 菲尔丁,2000年

© www.soinside.com 2019 - 2024. All rights reserved.