Rails 7连接Sorare WSS仅收Ping,GraphQL订阅无返回问题排查
问题背景
在Rails项目中尝试连接Sorare API的WSS服务,发送GraphQL订阅查询,先后使用faye-websocket、websocket-client-simple、action_cable_client等gem,也试过Channel文件中的JS方案,但均遇到同一问题:仅收到欢迎消息后持续收到Ping,无任何订阅数据返回。
相关代码与配置
action_cable_client示例代码
require 'json' require 'action_cable_client' EventMachine.run do uri = "wss://ws.sorare.com/cable" params = { channel: 'GraphqlChannel' } header = { "Authorization" => "Bearer #{ENV['S_TKN']}" } client = ActionCableClient.new(uri, params, true, header) query = <<-GRAPHQL subscription { aCardWasUpdated(rarities: [rare, super_rare, unique]) { slug } } GRAPHQL data = { query: query, variables: {}, action: 'execute' } message = { command: 'subscribe', identifier: {channel: 'GraphqlChannel'}, data: data }.to_json # called whenever a welcome message is received from the server client.connected { puts 'WebSocket connection successful.' } # Sends a message to the sever, with the 'action', 'speak' client.perform('speak', { message: message }) # called whenever a message is received from the server client.received do | message | puts message end client.pinged do |_data| puts "ping" end end
Rails配置文件
config.action_cable.disable_request_forgery_protection = true config.action_cable.url = 'wss://ws.sorare.com/cable' config.action_cable.allowed_request_origins = [ 'wss://ws.sorare.com/cable' , %r{http://sorare.*} ]
排查与解决建议
订阅消息格式错误:当前用
client.perform('speak', { message: message })发送了嵌套格式的消息,但Action Cable的perform方法会自动封装command、identifier和data结构,无需手动序列化整个消息。正确写法应为:# 构造execute动作所需数据 data = { query: query, variables: {} } # 直接调用perform指定动作和数据 client.perform('execute', data)身份验证有效性:确认
ENV['S_TKN']中的Token未过期,且拥有订阅aCardWasUpdated事件的权限。可先用Sorare REST API测试Token能否正常获取数据,排除权限或Token失效问题。订阅事件触发条件:
aCardWasUpdated仅在符合条件的卡片(rare/super_rare/unique)发生更新时推送数据,可能当前无对应更新事件。可更换为更频繁触发的订阅(如aTransferWasCompleted)测试是否能收到数据。客户端初始化优化:初始化
ActionCableClient时,第二个参数直接传入频道标识符即可,无需额外params包裹,可简化为:client = ActionCableClient.new(uri, { channel: 'GraphqlChannel' }, true, header)无效配置清理:提供的Rails配置是针对本地Action Cable服务的,对连接外部Sorare WebSocket服务无作用,可直接删除避免混淆。
内容的提问来源于stack exchange,提问作者Nicolas

