如何使用 gql 与 Apollo websocket 协议进行通信

问题描述 投票:0回答:1

我想连接到此网站后面的网络套接字(单击球员,以便高尔夫球场变得可见)。当我检查客户端和服务器之间的流量时,我看到第一条消息是握手:

{"type": "connection_init",
 "payload":
           {
            "accept-language": "en",
            "ec-version": "5.1.88",
            "sport": "GOLF",
            "referrer": "https://www.europeantour.com/",
            "operator": "europeantour"
           }
}

根据格式(字典的键),我得出结论,websocket 使用 Apollo websocket 传输协议。

接下来,我将关注 gql 文档中的 websocket-

example

import asyncio
import logging
from gql import gql, Client
from gql.transport.websockets import WebsocketsTransport


logging.basicConfig(level=logging.INFO)
    
async def main():
    transport = WebsocketsTransport(url='wss://btec-websocket.services.imgarena.com',
                                    init_payload={'accept-language': 'en',
                                                  'ec-version': '5.1.88',
                                                  'operator': 'europeantour',
                                                  'referrer': 'https://www.europeantour.com/',
                                                  'sport': 'GOLF'})
    async with Client(transport=transport,
                      fetch_schema_from_transport=False) as session:
        # do something
    

asyncio.run(main())

在阅读有关协议的更多信息后here我仍然不明白如何在我的

Python
脚本中向服务器发送消息 如何将以下消息发送到 websocket?

{
 "id": "1073897396",
 "type": "start",
 "operationName": "SubscribeToGolfTournamentStatus",
 "eventId": 488
}
python apollo gql
1个回答
0
投票

考虑您提供的 JSON 消息:

{
    "id": "1073897396",
    "type": "start",
    "operationName": "SubscribeToGolfTournamentStatus",
    "eventId": 488
}

operationName
表明您正在尝试启动名为
SubscribeToGolfTournamentStatus
的订阅。您将需要该名称所引用的实际 GraphQL 订阅查询。

因此,在您的情况下,要将消息发送到 WebSocket,您通常需要执行 GraphQL 订阅。在 Apollo WebSocket 协议的上下文中并使用

gql
库,您将使用
session.subscribe()
方法。

我们假设订阅查询如下所示(这只是一个占位符,您需要真正的订阅查询结构):

subscription SubscribeToGolfTournamentStatus($eventId: Int!) {
    golfTournamentStatus(eventId: $eventId) {
        ...YourDesiredFieldsHere
    }
}

以下是使用

gql
发送订阅的方法:

import asyncio
import logging
from gql import gql, Client
from gql.transport.websockets import WebsocketsTransport

logging.basicConfig(level=logging.INFO)

async def main():
    transport = WebsocketsTransport(url='wss://btec-websocket.services.imgarena.com',
                                    init_payload={
                                        'accept-language': 'en',
                                        'ec-version': '5.1.88',
                                        'operator': 'europeantour',
                                        'referrer': 'https://www.europeantour.com/',
                                        'sport': 'GOLF'
                                    })
    async with Client(transport=transport, fetch_schema_from_transport=False) as session:
        
        # Define the subscription
        subscription = gql('''
        subscription SubscribeToGolfTournamentStatus($eventId: Int!) {
            golfTournamentStatus(eventId: $eventId) {
                ...YourDesiredFieldsHere
            }
        }
        ''')

        # Subscribe and handle incoming data
        async for result in session.subscribe(subscription, variable_values={"eventId": 488}):
            print(result)

asyncio.run(main())

那就:

  • 使用
    gql
    函数定义 GraphQL 订阅(请记住,您需要将占位符 GraphQL 查询替换为您要定位的实际结构)。
    您可以在
    leszekhanusz/gql-actioncable
    中查看示例。
  • 使用
    session.subscribe()
    方法启动订阅并传递必要的变量(在本例中为
    eventId
    )。
  • 设置异步循环来处理来自订阅的传入数据。

官方示例相比

  • 在这两种情况下,您都可以使用给定的 URL 和负载初始化
    WebsocketsTransport
    ,然后创建
    Client
    会话。
  • 示例中的“
    do something
    ”部分经过扩展,专门展示了如何使用
    gql
    库执行订阅查询。
© www.soinside.com 2019 - 2024. All rights reserved.