关于 javascript:无法与 Kraken 的公共 Websocket API 建立握手

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))
}