gpt4 book ai didi

angularjs - 如何使用 Websockets 更新 REST API 请求状态

转载 作者:行者123 更新时间:2023-12-02 17:48:50 24 4
gpt4 key购买 nike

我使用基于 REST API 的内部 AngularJS SPA,问题是一些 REST 请求持续很长时间(约 5-10 秒)。

这是荒谬的,但与它无关 - 服务器需要从不同来源获取大量数据并在响应之前将其一起数学计算。

不错的解决方案是向用户显示请求状态,这里我们使用 WebSocket。

向用户显示请求状态的示例

  1. 请求已发送
  2. 请求已接受
  3. 从 DB1 获取数据
  4. 从 DB2 获取数据
  5. 数学数据
  6. 准备回复

但是有很多问题。

目前尚不清楚如何让哪个 API 用户发送请求来通知其状态。可能的解决方案是使用字典“API 客户端”-“Websocket 连接”,但它可能会在每次重新连接时崩溃并导致内存泄漏。不是吗?

也许解决方案是将整个 REST API 更改为 Websockets。但看起来这里有很多工作要做,而且我仍然需要重新发明缓存之类的东西。

无论从哪个 Angular 看都像是一团糟。这里更好的解决方案是什么?

最佳答案

最好同时提供 REST 和 Websocket,这样网页就可以使用 websocket 和没有 websocket 支持的自动化客户端,但仍然使用 API。您可以异步处理这些请求,并使用 REST async pattern .

休息:

  1. 客户端向 API 发送请求。
  2. API 获取请求并:
    • 为此处理任务创建一个唯一 ID。
    • 在数据存储中记录此任务的详细信息。
    • 向消息总线发送一条消息,请求处理具有该 ID 的任务。
    • 返回HTTP 202 AcceptedLocation队列端点的 header /queue/<taskid>提供任务的状态。
  3. 客户端获取响应,并可以轮询 Location 中指示的端点上此类处理的状态。定期 header 。
  4. 如果任务仍未处理,队列端点将返回 HTTP 202 Accepted .
  5. 消息总线另一端的后台工作人员选择消息并:
    • 转至数据存储以获取该任务 ID 的详细信息。
    • 进行处理。
    • 完成后,使用该 ID 更新任务的状态。
  6. 此时队列端点返回HTTP 303 See OtherLocation将客户端重定向到处理结果位置的 header 。

网络套接字:

  1. Websocket 连接在 session 开始时建立。
  2. websocket 服务器将传入消息转换为消息总线中的订阅操作,并将订阅消息转换为 websocket 中的消息。例子:
  3. 在 REST 步骤 3 中,不是按时间间隔轮询,而是使用 Websocket 发送应用程序定义的消息来订阅此类任务 ID 的更改。确保您可以知道如何从Location获取任务ID header ,或者仅在另一个 header 中提供任务 ID。
  4. Websocket 服务器应向服务总线表明此类连接订阅了一个主题,该主题可识别该任务 ID 的更改。
  5. 当后台工作线程完成数据处理后,更新任务状态后,还会向服务总线发出一条消息,其中包含标识该任务 ID 的主题。
  6. websocket 服务器将获取消息,然后将其发送给客户端。
  7. 然后,客户端可以向队列端点请求以找出处理结果的位置。您也可以通过 websocket 发送该位置,但根据我的经验,有时会很困难,因为 websocket 服务器可能是一个简单的 Windows 服务,不了解 URL 或资源位置。

关于angularjs - 如何使用 Websockets 更新 REST API 请求状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39768548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com