使用服务器发送的事件和EventSource进行GraphQL订阅

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

我正在考虑使用服务器发送的事件作为支持api来实现“订阅”类型。

我正在努力的是界面,更准确地说,是这种操作的http层。

问题:

使用本机EventSource不支持:

  1. 指定HTTP方法,默认使用“GET”。
  2. 包含有效负载(GraphQL查询)

虽然#1是无可辩驳的,但可以使用查询参数规避#2。

查询参数有〜2000个字符的限制(可以辩论),这使得仅仅依赖它们感觉太脆弱了。

我想到的解决方案是为每个可能的事件创建一个专用的终点。

例如:表示各方之间已完成事务的事件的URI:

/graphql/transaction-status/$ID

将在服务器中转换为此查询:

subscription TransactionStatusSubscription {
    status(id: $ID) {
        ready
    }
}

这种方法的问题是:

  1. 为每个URI-to-GraphQL转换创建一个处理程序。
  2. 部署新版本的服务器
  3. GraphQL提供的灵活性丧失 - >客户端应该控制查询
  4. 跟踪代码库中的所有端点(后端,前端,移动)

可能还有更多我遗漏的问题。

您可以想到更好的方法吗?一个是允许使用EventSource提供请求有效负载的更好方法?

graphql server-sent-events eventsource
1个回答
3
投票

GraphQL中的订阅通常使用WebSockets实现,而不是使用SSE实现。 Apollo和Relay都支持使用subscriptions-transport-ws客户端来监听事件。 Apollo Server包含用于使用WebSockets订阅的built-in support。如果您只是尝试实现订阅,那么最好使用这些现有解决方案之一。

也就是说,有一个库用于利用SSE订阅here。它看起来不再像以前一样了,但如果你一直想要让SSE工作,你可以在源代码中找一些想法。查看源代码,看起来作者通过使用返回订阅ID的POST请求初始化每个订阅来解决您在上面提到的限制。

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