Ich verwende IBM Bluemix, um einen Webdienst für ein Schulprojekt zu erstellen.
Mein Projekt muss einen JSON von einer API anfordern, damit ich die darin bereitgestellten Daten verwenden kann. Ich verwende die http get
Methode für einen Datensatz und bin mir nicht sicher, ob sie ordnungsgemäß funktioniert.
Wenn ich meinen Code ausführe, erhalte ich folgende Meldung:
Fehler: Protokoll "https:" wird nicht unterstützt. Erwartetes "http:"
Was verursacht es und wie kann ich es lösen?
Hier ist meine .js
Datei:
// 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); });
});
});
});
});
});
Hier ist ein Ausdruck des Fehlerbildschirms, den ich erhalte:
Als Randnotiz für alle, die nach einer Lösung von Google suchen ... stellen Sie sicher, dass Sie keine
http.Agent
mit einerhttps
Anfrage verwenden, da sonst dieser Fehler angezeigt wird.quelle
Der Grund für diesen Fehler ist, dass Sie versuchen, einen HTTPS-URI von einem HTTP-Client aufzurufen. Die ideale Lösung wäre gewesen, wenn ein generisches Modul das URI-Protokoll herausgefunden und die Entscheidung getroffen hätte, HTTPS oder HTTP intern zu verwenden.
Ich habe dieses Problem überwunden, indem ich die Schaltlogik selbst verwendet habe. Unten ist ein Code, der die Umschaltung für mich durchgeführt hat.
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); });
quelle