我很疲倦,试图自己解决这个问题。我正在尝试使用股票市场API,并且为此需要与其建立SSL连接。但是,我一直收到错误信息或者一些奇怪的东西。
当我试图使用正常的节点“net”模块连接套接字时,就像下面这样:
首先一切都很顺利,我收到了“已连接”的消息,感到非常高兴,但是接下来当我尝试实际登录时,我在控制台上只能看到“[Function]”然后是“连接已关闭”。是的,似乎从服务器获取的数据只有“[Function]”,这有点奇怪。编辑:现在我知道为什么会出现这种情况,谢谢Amberlamps。尽管问题仍然存在。
好的,所以我尝试了几种其他方法。以下是我使用socket.io-client的代码。
但问题并没有进入认证部分,它只给我一个“错误:connect EADDRNOTAVAIL”。我尝试过更改名称、端口、https到hppt等,但仍然得到相同的错误。你可能认为我的主机名存在错误,但并非如此,我从同一API中使用不同技术获取主机名和端口,但我也需要这个工作才能继续进行。
现在,请有经验的人给我一些解决该问题的见解。如果你发现任何可以改进的地方,我会尝试去做。
编辑(1): 如果我尝试使用普通的https而不是sockets,则会出现以下情况。
当我试图使用正常的节点“net”模块连接套接字时,就像下面这样:
var net = require('net');
var data = '';
var login = '{"cmd":"login", "args":{"session_key":"' + session_key + '", "service":"NEXTAPI"}} \n';
var socket = new net.Socket();
socket.connect(443, 'pub.api.test.nordnet.se', function () {
console.log('Connected');
});
socket.on('data', function (stuff) {
console.log(stuff.toString);
data += stuff;
});
socket.on('end', function () {
console.log(data);
});
socket.on('error', function (e) {
throw e;
});
socket.on('close', function () {
console.log('Connection closed.');
console.log(data.toString);
});
socket.write(login , function () {
console.log("Callback");
});
首先一切都很顺利,我收到了“已连接”的消息,感到非常高兴,但是接下来当我尝试实际登录时,我在控制台上只能看到“[Function]”然后是“连接已关闭”。是的,似乎从服务器获取的数据只有“[Function]”,这有点奇怪。编辑:现在我知道为什么会出现这种情况,谢谢Amberlamps。尽管问题仍然存在。
好的,所以我尝试了几种其他方法。以下是我使用socket.io-client的代码。
var client = io_client.connect('https://pub.test.api.nordnet.se:443', {secure: true});
client.on('data', function (stuff) {
console.log (stuff);
});
client.on('error', function (e) {
throw e;
});
client.on('end', function () {
console.log('Connection ended');
});
我一直收到的错误提示是“Error: getaddrinfo ENOENT”。无论我尝试什么,比如将主机名更改为skittles,或将https更改为http,或将其完全删除,甚至是其他我尝试过的方法,都会出现相同的错误。
好吧...这是我最后的尝试了,我想也许他们真的需要证书而我没有使用它。因此,这是我使用node的tls模块的另一段代码:
var tls = require ('tls');
var fs = require ('fs');
var options = {
host: 'pub.api.test.nordnet.se',
port: '443',
key: fs.readFileSync('NEXTAPI_TEST_public.pem'),
cert: fs.readFileSync('NEXTAPI_TEST_public.der')
};
var Stream = tls.connect(options, function () {
console.log('client connected', Stream.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(Stream);
process.stdin.resume();
});
Stream.on('data', function (stuff) {
console.log(stuff);
});
Stream.on('end', function () {
console.log('END');
});
Stream.on('error', function (err) {
throw err;
});
但问题并没有进入认证部分,它只给我一个“错误:connect EADDRNOTAVAIL”。我尝试过更改名称、端口、https到hppt等,但仍然得到相同的错误。你可能认为我的主机名存在错误,但并非如此,我从同一API中使用不同技术获取主机名和端口,但我也需要这个工作才能继续进行。
现在,请有经验的人给我一些解决该问题的见解。如果你发现任何可以改进的地方,我会尝试去做。
编辑(1): 如果我尝试使用普通的https而不是sockets,则会出现以下情况。
var https = require ('https');
var options = {
host: 'pub.api.test.nordnet.se',
path: '/',
port: '443',
auth: session_key + ':' + session_key, // Tried with and without this.
headers: {"Accept": "application/json", "Connection": "Keep-Alive"}
};
var request = https.get(options, function (res) {
res.on('data', function (stuff) {
console.log(stuff)
});
res.on('end', function () {
console.log("END");
});
})
.on('error', function (e) {
throw e;
});
我只得到了“错误:套接字挂起”。或者如果我指定https://pub.api... 我会得到“错误:getaddrinfo ENOENT”。
[Function]
,因为stuff.toString
是一个函数。你可能想要执行该函数:console.log(stuff.toString());
- Amberlamps