【问题标题】:Node.js HTTPS Request for Quandl APIQuandl API 的 Node.js HTTPS 请求
【发布时间】:2015-12-08 06:44:58
【问题描述】:

我正在使用 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 模块。

标签: json node.js https ibm-cloud quandl


【解决方案1】:

您的 https.get 应该可以正常工作。您的代码还有一些其他问题导致它崩溃,我在下面概述了这些问题并进行了解释:

1。 /home2 路由的嵌套可能不正确

您的/home2 路由声明在您的/home1 路由声明中。你的意思很可能是在外面。我已经在下面的代码中修复了这个问题(也修复了一些缩进)。

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

变量jsonhttps.get回调函数中使用之前没有定义。您将需要与http.get 回调中的行类似的行:var 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 网址中添加了 API 密钥。如果涉及敏感信息,我建议更改密钥。

【讨论】:

    【解决方案2】:

    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 服务器类似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多