如何使 Flutter graphql 订阅与渡轮包一起使用?

Ara*_*ero 1 subscription graphql flutter apollo-server

我有一个带有 apollo-server 的 graphql api。我使用 Graphql Playground 测试了所有查询、突变和订阅。

我正在使用 Ferry 包作为 grapqhl 客户端在 Flutter 中开发客户端应用程序。所有查询和突变都可以正常工作,但订阅却不能。

发送订阅请求时,会建立 Websocket 连接,但不会启动订阅。我在 Graphql Playground 上测试了订阅,连接请求消息如下所示

Graphql Playground 网络面板

但对于渡轮客户端,它会卡在connection_init上

Flutter Web 应用程序网络面板

var link = WebSocketLink(
      "ws://localhost:4000/graphql",
      initialPayload: {"subscriptionParam": arg},
    );
var client = Client(link: link);
client.request(request).listen((data) {//request is an object from autogenerated class from ferry
      log(data.toString());//never gets here
    }, onError: (error, stack) {
      log("Subscription error: " + error.toString());
    }); 
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?请帮助!

Ara*_*ero 5

所以我解决了我的问题,该问题与链接未在连接请求标头上发送 Sec-WebSocket-Protocol:graphql-ws 有关。所以我将链接初始化更改为:

final link = WebSocketLink(
      null, //Global.graphqlWsServerUrl,
      autoReconnect: true,
      reconnectInterval: Duration(seconds: 1),
      initialPayload: {"subscriptionParam": arg},
      channelGenerator: () => WebSocketChannel.connect(Uri.parse(Global.graphqlWsServerUrl), protocols: ['graphql-ws']),
    );
Run Code Online (Sandbox Code Playgroud)