2012-08-06 1 views
3

Je suis fatigué d'essayer de résoudre ce problème par moi-même. J'essaie de faire fonctionner une api boursière, et pour ce faire, j'ai besoin d'une connexion SSL. Hélas, tout ce que je reçois est des erreurs ou quelque chose d'étrange.Connexion SSL avec node.js

Quand je de me connecter à la prise en utilisant simplement le module « net » de noeud normal comme ceci:

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

tout va d'abord très bien, je reçois le message « Connecté » et je suis heureux, mais ALORS quand j'essaye de faire la connexion, tout ce que j'arrive sur ma console est "[Fonction]" puis "Connexion fermée". Oui, il semble que les données qui proviennent du serveur est seulement "[Fonction]". Ce qui est un peu bizarre. EDIT: Maintenant, je sais pourquoi je comprends, merci Amberlamps. Bien que le problème persiste. Ok, alors j'ai essayé la même chose avec quelques autres moyens. Voici mon code en utilisant 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'); 
}); 

Et tout ce que je reçois est "Erreur: getaddrinfo ENOENT". Et cela semble être la même erreur que j'essaie de faire, changer le nom d'hôte en skittles ou changer le https en http ou l'enlever complètement ou dieu sait ce que j'ai essayé.

D'accord ... voici mon essai final, je pense que peut-être, juste peut-être, ils ont vraiment besoin de la certification et je ne l'ai pas utilisé. Alors, voici mon autre morceau de code pour l'utilisation du module tls de noeud:

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

Mais il n'a même pas à la partie de certification, tout ce qu'il me donne est « Erreur: connexion EADDRNOTAVAIL ». Et encore une fois, j'ai essayé de changer le nom, le port, https à hppt etc, mais tout ce que je reçois est la même erreur. Oh et vous pourriez penser que j'ai juste une erreur dans mon nom d'hôte, mais non, je reçois ce nom d'hôte et le port de la même API en utilisant une technique différente, mais j'ai besoin de celui-ci aussi pour progresser.

Maintenant s'il vous plaît, quelqu'un me donner un aperçu de ce problème. Si vous trouvez quelque chose que je pourrais améliorer sur l'un des trois morceaux de code, je vais essayer de le faire.

EDIT (1): Voici ce qui se passe si j'essaie d'utiliser uniquement des https normaux et non des 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; 
}); 

Tout ce que je reçois est "Erreur: raccrochage du socket". Ou si je spécifie https://pub.api ... je reçois "Erreur: getaddrinfo ENOENT".

+1

Vous obtiendrez '[Function]' dans votre console parce que 'stuff.toString' est une fonction.Vous pourriez vouloir exécuter la fonction: 'console.log (stuff.toString());' – Amberlamps

+0

D'accord, je comprends maintenant. Bien que ça n'a pas beaucoup aidé, maintenant tout ce que je reçois est le propre tampon de node, qui ne me donne aucune information. Et si je l'imprime sans le .toString au socket.on ('close') il imprime juste ... euh ... § ♥ ☻☻. Ouais. Cette. Qu'avez-vous voulu dire en exécutant la fonction? Si j'exécute le .toString et que je l'imprime, cela donne le même § ♥ ☻☻. –

+0

toString est exactement le même que le premier argument, s'il est de type string. "Erreur: getaddrinfo ENOENT" signifie que Node n'est pas capable de résoudre l'hôte donné. Cela se produit si NS ou des informations similaires sont erronées ou activement bloquées. –

Répondre

0

Comme il s'agit d'une API REST, la tentative avec le module https est la bonne. Mais, selon la documentation, vous devriez essayer de vous connecter à "https://api.test.nordnet.se/next/1" à la place. '1' étant la version de l'API. Cela devrait expliquer la réinitialisation ENOENT/connexion.

En interrogeant cela, vous obtiendrez le statut de l'API. La prochaine étape consiste à vous connecter.

J'ai trouvé un très bon exemple Python ici: https://api.test.nordnet.se/boards/2/topics/297?r=340#message-340