【问题标题】:REST API How to update client side data after sending request to backendREST API 如何在向后端发送请求后更新客户端数据
【发布时间】:2019-07-05 10:17:38
【问题描述】:

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

例子:

  • 向后端添加新项目的 POST 请求。响应正文包含添加的项目。 Http状态码201已创建

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

解决方案?

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

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

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

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

【问题讨论】:

  • 我只需要一个用户操作就可以从前端发出 2 个请求。您 POST 值,然后一旦收到响应,前端将发出更新列表的 GET 请求。

标签: rest api client backend


【解决方案1】:

如何保持一切同步?

在 REST 中,您不需要。每个客户端(可能)都有自己的本地缓存。服务器在其响应中包含standardized caching metadata,以向客户端提供信息可能更改频率的提示。

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

当然,服务器仍然有权威副本,我们有standardized conditional requests,当客户端数据太陈旧时,我们可以选择。

后端成功处理完这个请求后,如何在客户端反映这些变化?

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

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

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

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

在大多数情况下,REST 是一堆伪装成网络浏览器的机器与伪装成网络服务器的机器对话。

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

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 2019-07-19
    • 2014-10-24
    • 2019-07-17
    相关资源
    最近更新 更多