使用R、httr2与WebSocket获取流响应遇400错误求助
问题分析与解决方案
核心问题:httr2不支持WebSocket
httr2是为HTTP/HTTPS请求设计的工具,不原生支持WebSocket协议。你用req_stream处理WebSocket连接,本质是用HTTP协议请求WebSocket端点,协议不匹配直接导致400错误。
正确实现方式:使用WebSocket专用R包
R中有专门处理WebSocket的包,比如websocket,以下是适配Saxo OpenAPI流的示例代码:
library(websocket) # 注意:WebSocket URL需用ws://(明文)或wss://(加密)开头,而非http:// url <- "wss://streaming.saxobank.com/sim/openapi/streamingws/connect?contextId=4UpfnD4ycH" # 创建WebSocket客户端,设置Authorization请求头 ws <- WebSocket$new( url, headers = list(Authorization = "BEARER mytoken") # 传入完整的Bearer Token ) # 定义消息接收回调 ws$onMessage(function(event) { cat("收到数据:", event$data, "\n") }) # 定义连接成功回调 ws$onOpen(function(event) { cat("连接成功,等待数据流\n") # 参考Saxo文档发送订阅指令,示例: # ws$send('{"ContextId":"4UpfnD4ycH","ReferenceId":"sub1","Type":"Subscribe","Arguments":{"AccountKey":"your_account","Streams":["Prices"],"Format":"Json"}}') }) # 定义错误回调 ws$onError(function(event) { cat("连接出错:", event$message, "\n") }) # 定义关闭回调 ws$onClose(function(event) { cat("连接关闭,错误码:", event$code, ",原因:", event$reason, "\n") }) # 启动连接 ws$connect()
原代码的问题点
- 协议格式错误:WebSocket服务端URL必须以
ws://或wss://开头,原代码用http://不符合WebSocket协议规范。 - 工具适配错误:
req_stream是httr2用于处理HTTP流式响应(如Server-Sent Events)的方法,无法处理WebSocket的双向通信机制。
额外注意事项
- 确保Bearer Token有效且具备流式数据访问权限。
- 必须按照Saxo OpenAPI文档要求发送订阅指令,否则无法收到股票价格数据。
- 生产环境建议使用
wss://加密连接,避免明文传输敏感数据。
内容的提问来源于stack exchange,提问作者Lasse Hjorth Madsen
相关产品推荐
相关产品推荐

