我正在考虑使用服务器发送的事件作为支持api来实现“订阅”类型。
我正在努力的是界面,更准确地说,是这种操作的http层。
问题:
使用本机EventSource不支持:
虽然#1是无可辩驳的,但可以使用查询参数规避#2。
查询参数有〜2000个字符的限制(可以辩论),这使得仅仅依赖它们感觉太脆弱了。
我想到的解决方案是为每个可能的事件创建一个专用的终点。
例如:表示各方之间已完成事务的事件的URI:
/graphql/transaction-status/$ID
将在服务器中转换为此查询:
subscription TransactionStatusSubscription {
status(id: $ID) {
ready
}
}
这种方法的问题是:
可能还有更多我遗漏的问题。
您可以想到更好的方法吗?一个是允许使用EventSource提供请求有效负载的更好方法?
GraphQL中的订阅通常使用WebSockets实现,而不是使用SSE实现。 Apollo和Relay都支持使用subscriptions-transport-ws客户端来监听事件。 Apollo Server包含用于使用WebSockets订阅的built-in support。如果您只是尝试实现订阅,那么最好使用这些现有解决方案之一。
也就是说,有一个库用于利用SSE订阅here。它看起来不再像以前一样了,但如果你一直想要让SSE工作,你可以在源代码中找一些想法。查看源代码,看起来作者通过使用返回订阅ID的POST请求初始化每个订阅来解决您在上面提到的限制。