gpt4 book ai didi

rest - 如何结合 websockets 和 http 来创建一个保持数据最新的 REST API?

转载 作者:行者123 更新时间:2023-12-03 06:11:18 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

3年前关闭。




Improve this question




我正在考虑使用 websockets 和 http 构建一个 REST API,我使用 websockets 告诉客户端新数据可用或直接向客户端提供新数据。

以下是关于它如何工作的一些不同想法:
ws = websocket

想法一:

  • David 通过 GET /users 获取所有用户
  • Jacob 使用 POST /users 添加用户
  • 向所有客户端发送一条 ws 消息,其中包含新用户存在的信息
  • David 收到 ws 的消息并调用 GET /users

  • 想法 B:
  • David 通过 GET /users 获取所有用户
  • 当对 /users 进行更改时,David 注册以获取 ws 更新
  • Jacob 使用 POST /users 添加用户
  • 新用户由 ws
  • 发送给 David

    想法C:
  • David 通过 GET /users 获取所有用户
  • 当对 /users 进行更改时,David 注册以获取 ws 更新
  • Jacob 使用 POST /users 添加用户它得到 id 4
  • David 通过 ws
  • 收到新用户的 id 4
  • David 通过 GET /users/4 获取新用户

  • 我死了:
  • David 通过 GET /users 获取所有用户
  • 当对 /users 进行更改时,David 注册以获取 ws 更新.
  • Jacob 使用 POST /users 添加用户
  • David 收到一条 ws 消息,指出对 /users 的更改已完成。
  • David 通过调用 GET /users?lastcall='time of step one' 仅获得增量

  • 哪种选择是最好的,优缺点是什么?
    它是另一个更好的“想法 E”吗?
    我们甚至需要使用 REST 还是 ws 足以处理所有数据?

    编辑
    为了解决数据不同步的问题,我们可以提供标题“If-Unmodified-Since” https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Unmodified-Since或“电子标签” https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag或两者都有 PUT 请求。

    最佳答案

    我个人在生产中使用过 Idea B,对结果非常满意。我们使用 http://www.axonframework.org/ ,因此实体的每次更改或创建都会在整个应用程序中作为事件发布。然后这些事件用于更新几个读取模型,这些模型基本上是支持一个或多个查询的简单 Mysql 表。我在事件处理器中添加了一些拦截器来更新这些读取模型,以便它们在数据提交到数据库后发布刚刚处理的事件。

    事件的发布是通过网络套接字上的 STOMP 完成的。使用 Spring 的 Web Socket 支持(https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html)非常简单。我是这样写的:

    @Override
    protected void dispatch(Object serializedEvent, String topic, Class eventClass) {
    Map<String, Object> headers = new HashMap<>();
    headers.put("eventType", eventClass.getName());
    messagingTemplate.convertAndSend("/topic" + topic, serializedEvent, headers);
    }

    我编写了一个使用 Springs bean factory API 的小配置器,这样我就可以像这样注释我的 Axon 事件处理程序:
    @PublishToTopics({
    @PublishToTopic(value = "/salary-table/{agreementId}/{salaryTableId}", eventClass = SalaryTableChanged.class),
    @PublishToTopic(
    value = "/salary-table-replacement/{agreementId}/{activatedTable}/{deactivatedTable}",
    eventClass = ActiveSalaryTableReplaced.class
    )
    })

    当然,这只是一种方法。在客户端连接可能如下所示:
    var connectedClient = $.Deferred();

    function initialize() {
    var basePath = ApplicationContext.cataDirectBaseUrl().replace(/^https/, 'wss');
    var accessToken = ApplicationContext.accessToken();
    var socket = new WebSocket(basePath + '/wss/query-events?access_token=' + accessToken);
    var stompClient = Stomp.over(socket);

    stompClient.connect({}, function () {
    connectedClient.resolve(stompClient);
    });
    }


    this.subscribe = function (topic, callBack) {
    connectedClient.then(function (stompClient) {
    stompClient.subscribe('/topic' + topic, function (frame) {
    callBack(frame.headers.eventType, JSON.parse(frame.body));
    });
    });
    };

    initialize();

    关于rest - 如何结合 websockets 和 http 来创建一个保持数据最新的 REST API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33424636/

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