You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:35:25