与node.js的SSL连接

问题描述:

我厌倦了试图自己解决这个问题。我试图让股票市场API工作,为此,我需要一个SSL连接。唉,我所得到的只是错误或奇怪的东西。与node.js的SSL连接

当我通过只使用普通节点的“网”模块这样连接到插座:

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

首先一切顺利就好了,我得到的“连接”的消息,我很高兴,但那么当我尝试进行实际的登录时,我到达控制台的所有内容都是“[功能]”,然后是“连接关闭”。是的,似乎来自服务器的数据只是“[功能]”。这有点奇怪。编辑:现在我知道我为什么得到它,谢谢安伯兰灯。虽然问题依然存在。

好的,所以我尝试了其他几种方法。这是我使用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”。这似乎是同样的错误,无论我尝试使用它,将主机名更改为吃喝玩乐或将https更改为http或完全删除它或上帝知道我已经尝试过。

好的......这是我最后的尝试,我虽然也许,也许,他们确实需要认证,我没有使用它。因此,这里是我还没有使用节点的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; 
}); 

但它甚至没有得到认证的一部分,一切都是为了给我的是“错误:连接EADDRNOTAVAIL”。再一次,我试图改变名称,端口,https到hppt等,但我得到的是同样的错误。哦,你可能会认为我的主机名只有一个错误,但不是,我使用不同的技术从同一个API获取主机名和端口,但为了进步,我也需要这个主机名。

现在请有人给我一些关于这个问题的见解。如果您发现任何可以改进的三段代码中的任何一段,我会尽力而为。

编辑(1): 这里是如果我尝试使用普通的https而不是套接字,会发生什么。

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 2012-08-06 09:20:18

+0

好吧,我现在明白了。虽然没有多大帮助,但我现在所获得的只是节点自己的缓冲区,它并不给我提供任何信息。如果我在socket.on('close')没有.toString的情况下打印它,它就会打印出......呃......§♥☻☻。是啊。那。你执行这个函数是什么意思?如果我执行.toString然后打印它,它只是给出了相同的§♥☻☻。 – 2012-08-06 10:22:30

+0

toString与第一个参数完全相同,如果它是字符串类型。 “错误:getaddrinfo ENOENT”表示Node无法解析给定的主机。如果NS或类似信息错误或主动阻止,会发生这种情况。 – 2012-08-30 18:41:03

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

查询此操作会返回api状态。下一步是登录。

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

有一个在一个新的节点例如: https://api.test.nordnet.se/projects/api/wiki/Code_examples#Login-and-feed-example-in-Nodejs

你基本上需要使用其他登录,然后登录到带有会话密钥的饲料。