如何使 Flutter graphql 订阅与渡轮包一起使用?
how can I make Flutter graphql subscription work with ferry package?
我有一个带有 apollo-server 的 graphql api。我使用 Graphql Playground 测试了所有查询、变更和订阅。
我正在使用 Ferry 包作为 grapqhl 客户端在 Flutter 中开发客户端应用程序。所有查询和变更都可以正常工作,但订阅不行。
发送订阅请求时,websocket 连接已建立,但订阅并未启动。我在 Graphql Playground 上测试了订阅,连接请求消息如下所示
Graphql Playground network panel
但是对于渡轮客户端,它会卡在 connection_init
Flutter Web app network panel
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());
});
我的代码有什么问题?请帮忙!
伙计们,我解决了我的问题,这个问题与 link 在连接请求 headers 上不发送 Sec-WebSocket-Protocol:graphql-ws 有关。所以我将 link 初始化更改为:
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']),
);
我有一个带有 apollo-server 的 graphql api。我使用 Graphql Playground 测试了所有查询、变更和订阅。
我正在使用 Ferry 包作为 grapqhl 客户端在 Flutter 中开发客户端应用程序。所有查询和变更都可以正常工作,但订阅不行。
发送订阅请求时,websocket 连接已建立,但订阅并未启动。我在 Graphql Playground 上测试了订阅,连接请求消息如下所示
Graphql Playground network panel
但是对于渡轮客户端,它会卡在 connection_init
Flutter Web app network panel
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());
});
我的代码有什么问题?请帮忙!
伙计们,我解决了我的问题,这个问题与 link 在连接请求 headers 上不发送 Sec-WebSocket-Protocol:graphql-ws 有关。所以我将 link 初始化更改为:
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']),
);