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

ela*_*hen 7 server-sent-events graphql eventsource

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

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

问题:

使用本机EventSource不支持:

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

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

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

我正在考虑的解决方案是为每个可能的事件创建一个专用端点。

例如:代表各方之间已完成交易的事件的 URI:

/graphql/transaction-status/$ID

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

subscription TransactionStatusSubscription {
    status(id: $ID) {
        ready
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是:

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

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

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

Dan*_*den 10

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

这就是说,有一个为利用上证所订阅图书馆在这里。它看起来不再维护了,但是如果您一心想要让 SSE 工作,您可以浏览源代码以获取一些想法。查看源代码,作者似乎通过使用返回订阅 ID 的 POST 请求初始化每个订阅来绕过您上面提到的限制。