我正在使用IBM Bluemix为学校项目制作Web服务.
我的项目需要从API请求JSON,因此我可以使用它提供的数据.我使用该http get
方法的数据集,我不知道它是否正常工作.
当我运行我的代码时,我收到消息:
错误:不支持协议"https:".预计"http:"
是什么导致它,我该如何解决?
这是我的.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'); // 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) { http.get('https://www.quandl.com/api/v3/datasets/BCB/432.json?api_key=d1HxqKq2esLRKDmZSHR2', 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资源时,您需要使用https.get
,而不是http.get
.
https://nodejs.org/api/https.html
作为向Google寻求解决方案的任何人的旁注...确保您没有使用带有https请求的http.Agent,否则您将收到此错误.
出现此错误的原因是您尝试从HTTP客户端调用HTTPS URI.理想的解决方案是通用模块来确定URI协议并决定在内部使用HTTPS或HTTP.
我克服这个问题的方法是自己使用切换逻辑.下面是一些为我做转换的代码.
var http = require('http'); var https = require('https'); // Setting http to be the default client to retrieve the URI. var url = new URL("https://www.google.com") var client = http; /* default client */ // You can use url.protocol as well /*if (url.toString().indexOf("https") === 0){ client = https; }*/ /* Enhancement : using the URL.protocol parameter * the URL object , provides a parameter url.protocol that gives you * the protocol value ( determined by the protocol ID before * the ":" in the url. * This makes it easier to determine the protocol, and to support other * protocols like ftp , file etc) */ client=(url.protocol=="https") ? https:client; // Now the client is loaded with the correct Client to retrieve the URI. var req = client.get(url, function(res){ // Do what you wanted to do with the response 'res'. console.log(res); });