Unable to establish Handshake with Public Websocket API for Kraken
我正在尝试为加密货币代码创建一个监视列表你输入一个代码,添加它,它会以表格的形式向你显示实时价格。
我的第一步是尝试与 Kraken websocket API 建立握手连接(此处的文档:https://www.kraken.com/features/websocket-api#connectionDetails)
我的问题:
目前,我要做的就是能够在控制台记录"连接成功",以便当我从 Kraken(加密交换)连接到 websocket API 时。我正在尝试通过以下部分执行此操作(一直向下滚动以查看所有代码)
1 2 3 4 | socket.onopen = function(event) { socketStatus.innerHTML = 'Connected to: ' + event.currentTarget.url; socketStatus.className = 'open'; }; |
我有一个 index.html 文件和一个 app.js 文件。当我在 chrome 中打开 index.html 文件时,出现错误:
app.js:5 WebSocket 连接到 \\'ws://ws-sandbox.kraken.com/\\' 失败:WebSocket 握手期间出错:意外响应代码:521
我已经尝试过只用这行代码来处理 websocket 相关的东西
1 | var socket = new WebSocket('ws://ws-sandbox.kraken.com') |
我也尝试过使用 get 方法,在此处的示例中提供
https://medium.freecodecamp.org/here-is-the-most-popular-ways-to-make-an-http-request-in-javascript-954ce8c95aaa
1 | $.get('ws://ws-sandbox.kraken.com',function(data){console.log(`${data}`)}) |
在我的 app.js 文件中,我的问题是,除了下面的行之外,我还需要什么才能成功握手?我是否需要发送带有标头信息的 GET 请求(请参阅最后)?
1 | var socket = new WebSocket('ws://ws-sandbox.kraken.com') |
在文档中,您将看到连接详细信息。沙盒环境的连接详细信息。 URL 是 ws-sandbox.kraken.com
链接:https://www.kraken.com/features/websocket-api#connectionDetails
我已按照此处的示例进行操作:
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
获取请求问题:
我以这个网站为例:
https://blog.teamtreehouse.com/an-introduction-to-websockets
它说我需要使用类似的东西向服务器发送一个 HTTP 请求。我只是不确定这是否是我想做的事情所必需的。
1 2 3 4 5 | GET ws://websocket.example.com/ HTTP/1.1 Origin: http://example.com Connection: Upgrade Host: websocket.example.com Upgrade: websocket |
APP.JS 文件中的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $(document).ready(function(){ console.log('page ready') var socket = new WebSocket('ws://ws-sandbox.kraken.com') $.get('ws://ws-sandbox.kraken.com',function(data){console.log(`${data}`)}) var form = document.getElementById('message-form'); var messageField = document.getElementById('message'); var messagesList = document.getElementById('messages'); var socketStatus = document.getElementById('status'); var closeBtn = document.getElementById('close'); socket.onopen = function(event) { //LOGGING SUCCESSFUL CONNECTION HERE socketStatus.innerHTML = 'Connected to: ' + event.currentTarget.url; socketStatus.className = 'open'; }; }) |
我知道这是一个老问题,但我遇到了同样的问题,想提供我的解决方案,以防其他人来到这里需要它。
所以我发现这个错误的原因是因为我使用了 API 不支持的协议。我使用的是 TLS 1.0,其中 Kraken API 仅支持 1.2/1.3:
https://support.kraken.com/hc/en-us/articles/360023264371-TLS-upgrade-that-might-affect-your-API-connections
为了解决这个问题,我简单地将我的 websocket 客户端设置为使用 TLS 1.2 作为协议。
从浏览器,使用 Websocket() 内置 api:
1 2 3 4 5 6 7 8 9 10 11 12 | new WebSocket("wss://ws.kraken.com").onopen = function(){ this.onclose = () => console.log("SOCKET CLOSED") this.onmessage = (e) => console.log(JSON.parse(e.data)) this.send(JSON.stringify({ "event":"subscribe", "pair": ["XBT/USD"], "subscription": { "interval": 1, "name":"ohlc" } }), (e) => console.log(e)) } |