使用node.js建立SSL连接

4
我很疲倦,试图自己解决这个问题。我正在尝试使用股票市场API,并且为此需要与其建立SSL连接。但是,我一直收到错误信息或者一些奇怪的东西。
当我试图使用正常的节点“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”。


1
你的控制台将显示 [Function],因为 stuff.toString 是一个函数。你可能想要执行该函数:console.log(stuff.toString()); - Amberlamps
好的,我现在明白了。虽然帮助不大,但现在我只得到了节点自己的缓冲区,它根本没有给我任何信息。如果我在socket.on('close')中不加.toString打印它,它只会打印……呃……§♥ ☻☻。是的,就是那个。你所说的执行函数是什么意思?如果我执行.toString然后打印它,它只会给出相同的§♥ ☻☻。 - Petri Mustonen
toString与第一个参数完全相同,如果它是字符串类型。"Error: getaddrinfo ENOENT"的意思是,Node无法解析给定的主机。如果NS或类似信息错误或被积极阻止,则会发生这种情况。 - 19h
2个回答

0

0

由于这是一个REST API,使用https模块进行尝试是正确的。但是,根据文档,您应该尝试连接到“https://api.test.nordnet.se/next/1”而不是“https://api.test.nordnet.se”。'1'是API版本。这应该可以解释ENOENT /连接重置。

查询此内容将返回API状态。下一步是登录。

我在这里找到了一个相当不错的Python示例:https://api.test.nordnet.se/boards/2/topics/297?r=340#message-340


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接