繁体   English   中英

Node.js HTTPS请求Quandl API

[英]Node.js HTTPS Request for Quandl API

我正在使用IBM Bluemix为学校项目提供Web服务。

我的项目需要从两个API请求JSON数据,以便在项目中使用。

第一个是http.request ,我执行得很好。 但是,对于第二个,我需要一个https.request这就是麻烦所在。

我不知道如何通过https请求get JSON。 我一直在尝试为http代码改编代码,但是我的努力变得毫无用处。

如何通过https请求JSON?

这是我的.js文件:

 // Hello. // // This is JSHint, a tool that helps to detect errors and potential // problems in your JavaScript code. // // To start, simply enter some JavaScript anywhere on this page. Your // report will appear on the right side. // // Additionally, you can toggle specific options in the Configure // menu. function main() { return 'Hello, World!'; } main();/*eslint-env node*/ //------------------------------------------------------------------------------ // node.js starter application for Bluemix //------------------------------------------------------------------------------ // HTTP request - duas alternativas var http = require('http'); var request = require('request'); //HTTPS request var https = require('https'); var https = require('https'); var fs = require('fs'); // cfenv provides access to your Cloud Foundry environment // for more info, see: https://www.npmjs.com/package/cfenv var cfenv = require('cfenv'); //chama o express, que abre o servidor var express = require('express'); // create a new express server var app = express(); // serve the files out of ./public as our main files app.use(express.static(__dirname + '/public')); // get the app environment from Cloud Foundry var appEnv = cfenv.getAppEnv(); // start server on the specified port and binding host app.listen(appEnv.port, '0.0.0.0', function() { // print a message when the server starts listening console.log("server starting on " + appEnv.url); }); app.get('/home1', function (req,res) { http.get('http://developers.agenciaideias.com.br/cotacoes/json', function (res2) { var body = ''; res2.on('data', function (chunk) { body += chunk; }); res2.on('end', function () { var json = JSON.parse(body); var CotacaoDolar = json["dolar"]["cotacao"]; var VariacaoDolar = json["dolar"]["variacao"]; var CotacaoEuro = json["euro"]["cotacao"]; var VariacaoEuro = json["euro"]["variacao"]; var Atualizacao = json["atualizacao"]; obj=req.query; DolarUsuario=obj['dolar']; RealUsuario=Number(obj['dolar'])*CotacaoDolar; EuroUsuario=obj['euro']; RealUsuario2=Number(obj['euro'])*CotacaoEuro; Oi=1*VariacaoDolar; Oi2=1*VariacaoEuro; if (VariacaoDolar<0) { recomend= "Recomenda-se, portanto, comprar dólares."; } else if (VariacaoDolar=0){ recomend=""; } else { recomend="Recomenda-se, portanto, vender dólares."; } if (VariacaoEuro<0) { recomend2= "Recomenda-se, portanto, comprar euros."; } else if (VariacaoEuro=0){ recomend2=""; } else { recomend2="Recomenda-se,portanto, vender euros."; } res.render('cotacao_response.jade', { 'CotacaoDolar':CotacaoDolar, 'VariacaoDolar':VariacaoDolar, 'Atualizacao':Atualizacao, 'RealUsuario':RealUsuario, 'DolarUsuario':DolarUsuario, 'CotacaoEuro':CotacaoEuro, 'VariacaoEuro':VariacaoEuro, 'RealUsuario2':RealUsuario2, 'recomend':recomend, 'recomend2':recomend2, 'Oi':Oi, 'Oi2':Oi2 }); app.get('/home2', function (req,res) { https.get('https://www.quandl.com/api/v3/datasets/BCB/432.json?api_key=YOUR_API_KEY', function (res3) { var body = ''; res3.on('data', function (chunk) { body += chunk; }); res3.on('end', function () { var x=json.dataset.data[0][1]; console.log("My JSON is "+x); }); }); }); }); }); }); 

您的https.get应该可以按设置工作。 您的代码还有一些其他问题导致代码中断,以下是我在概述时进行的解释:

1. /home2路由的潜在错误嵌套

您对/home2路由的声明位于/home1路由的声明内。 您可能是说它在外面。 我已经在下面的代码中修复了这个问题(并修复了一些缩进问题)。

2. json在/home2路由的https.get回调中未定义

变量jsonhttps.get回调函数中使用之前https.get 您将需要类似于http.get回调中的http.getvar json = JSON.parse(body);

这是路线的固定代码

app.get('/home1', function (req,res) {
    http.get('http://developers.agenciaideias.com.br/cotacoes/json', function (res2) {
        var body = '';

        res2.on('data', function (chunk) {
            body += chunk;
        });

        res2.on('end', function () {
            var json = JSON.parse(body);
            var CotacaoDolar = json["dolar"]["cotacao"];
            var VariacaoDolar = json["dolar"]["variacao"];
            var CotacaoEuro = json["euro"]["cotacao"];
            var VariacaoEuro = json["euro"]["variacao"];
            var Atualizacao = json["atualizacao"];

            obj=req.query; 

            DolarUsuario=obj['dolar'];
            RealUsuario=Number(obj['dolar'])*CotacaoDolar;

            EuroUsuario=obj['euro'];
            RealUsuario2=Number(obj['euro'])*CotacaoEuro;

            Oi=1*VariacaoDolar;
            Oi2=1*VariacaoEuro;

            if (VariacaoDolar<0) {
                recomend= "Recomenda-se, portanto, comprar dólares.";
            }

            else if (VariacaoDolar=0){
                recomend="";
            }

            else {
                recomend="Recomenda-se, portanto, vender dólares.";
            }

            if (VariacaoEuro<0) {
                recomend2= "Recomenda-se, portanto, comprar euros.";
            }

            else if (VariacaoEuro=0){
                recomend2="";
            }
            else {
                recomend2="Recomenda-se,portanto, vender euros.";
            }

            res.render('cotacao_response.jade', {
               'CotacaoDolar':CotacaoDolar,
               'VariacaoDolar':VariacaoDolar,
               'Atualizacao':Atualizacao,
               'RealUsuario':RealUsuario,
               'DolarUsuario':DolarUsuario,
               'CotacaoEuro':CotacaoEuro,
               'VariacaoEuro':VariacaoEuro,
               'RealUsuario2':RealUsuario2,
               'recomend':recomend,
               'recomend2':recomend2,
               'Oi':Oi,
               'Oi2':Oi2
            });
        });
    });
});

app.get('/home2', function (req,res) {
    https.get('https://www.quandl.com/api/v3/datasets/BCB/432.json?api_key=YOUR_API_KEY', function (res3) {
        var body = '';

        res3.on('data', function (chunk) {
            body += chunk;
        });

        res3.on('end', function () {
            var json = JSON.parse(body);
            var x=json.dataset.data[0][1];
            console.log("My JSON is "+x);
            res.send('done https: JSON result: '+x);
        });
    });
});

最后说明

您已在https URL中添加了API密钥。 如果涉及敏感信息,我建议更改密钥。

HTTPS服务器和客户端API与HTTP API几乎相同,实际上,客户端API是相同的,并且HTTPS服务器的不同之处仅在于它需要证书文件。

启动服务器

要启动HTTPS服务器,您需要读取私钥和证书。 请注意,在这种情况下使用readFileSync,因为在服务器启动时阻止读取证书是可以接受的:

// HTTPS
var https = require('https');
// read in the private key and certificate
var pk = fs.readFileSync('./privatekey.pem');
var pc = fs.readFileSync('./certificate.pem');
var opts = { key: pk, cert: pc };
// create the secure server
var serv = https.createServer(opts, function(req, res) {
  console.log(req);
  res.end();
});
// listen on port 443
serv.listen(443, '0.0.0.0');

请注意,在Linux上,您可能需要以更高的特权运行服务器以绑定到端口443。除了需要读取私钥和证书之外,HTTPS服务器的工作方式类似于HTTP服务器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM