0

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

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

第一个是 a http.request,我执行得很好。然而,对于第二个,我需要一个https.request- 这就是麻烦的来源。

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

如何通过请求 JSON https

这是我的.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); });
      
    });
    });
        });
    });
});

4

2 回答 2

1

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

/home21.路线嵌套可能不正确

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

/home22.路由https.get回调中未定义json

在回调函数json中使用之前未定义该变量。https.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 URL 中添加了 API 密钥。如果涉及敏感信息,我建议更改密钥。

于 2015-12-08T07:06:55.310 回答
0

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

于 2015-12-08T06:55:46.823 回答