如何用Python与Blazor Server建立HTTP请求交互?
用Python与Blazor Server交互的实现方法
可以通过模拟Blazor Server底层依赖的SignalR通信协议来实现Python脚本与Blazor服务器的交互,核心是复现SignalR的连接协商、消息构造和请求发送流程,具体步骤如下:
1. 完成SignalR协商,获取连接凭证
首先发送协商请求,获取后续通信所需的connectionId和connectionToken:
import requests session = requests.Session() # 若站点需要身份验证,先模拟登录并保留Cookie(示例需替换实际登录逻辑) # session.post("http://the-website.com/account/login", data={"username": "your-user", "password": "your-pass"}) # 发送协商请求 negotiate_url = "http://the-website.com/_blazor/negotiate?negotiateVersion=1" negotiate_res = session.get(negotiate_url) negotiate_data = negotiate_res.json() connection_id = negotiate_data["connectionId"] connection_token = negotiate_data["connectionToken"]
2. 选择传输方式,构造通信URL
从协商返回的availableTransports中选择适合Python模拟的传输方式,推荐LongPolling(无需持续连接,更易模拟):
long_poll_url = f"http://the-website.com/_blazor?id={connection_id}&connectionToken={connection_token}"
3. 构造Blazor方法调用的SignalR消息
Blazor通过SignalR发送的调用消息遵循固定格式,核心字段说明:
type: 1表示调用方法,2表示调用成功,3表示调用错误invocationId: 自增的唯一标识(可从0开始)target: 要调用的Blazor方法全名(需包含命名空间和类名,如Pages.Home.SubmitForm)arguments: 方法所需的参数数组
示例构造调用消息:
import json # 替换为实际要调用的Blazor方法和参数 target_method = "Pages.Counter.IncrementCount" method_args = [] signalr_message = { "type": 1, "invocationId": "0", "target": target_method, "arguments": method_args }
4. 发送请求并解析响应
将构造好的消息以JSON形式发送到LongPolling URL,并解析服务器返回的SignalR响应:
headers = { "Content-Type": "application/json", "Accept": "text/plain, */*" } # 发送调用请求 response = session.post(long_poll_url, headers=headers, data=json.dumps(signalr_message)) # 解析响应(服务器可能返回多条消息,以换行分隔) for line in response.text.splitlines(): if not line: continue msg = json.loads(line) if msg["type"] == 2: print(f"方法调用成功,返回结果: {msg.get('result')}") elif msg["type"] == 3: print(f"方法调用失败,错误信息: {msg.get('error')}")
关键注意事项
- 方法名准确性: 必须确认Blazor组件中方法的完整名称(可通过浏览器调试工具查看Blazor日志或反编译DLL获取)
- 身份验证: 若站点需要登录,需先完成登录流程并保留会话Cookie,所有后续请求使用同一个
requests.Session实例 - 二进制消息处理: 若遇到二进制格式的SignalR消息,可使用Python的
signalr-client库简化解析(手动解析需遵循SignalR的二进制协议规范)
内容的提问来源于stack exchange,提问作者Amir Nosshinfar
相关产品推荐
相关产品推荐

