如何使用https.request和Node.JS加载JSON / API数据

时间:2018-05-10 12:37:17

标签: javascript jquery node.js

我正在尝试加载天气数据。我有完整的前端代码,但我需要将其移至后端。我将我的函数库移到了Node.JS.我使用$ .getJSON但被告知我应该使用https.request来获得新版本。这是我的代码:

getTextWeatherUsingStationUsingRequest: function(theStation){

    const http = require("http");
    const https = require("https");

    thePath = 'stations/' + theStation + '/observations/current';
    // theURL = 'https://api.weather.gov/stations/' + theStation + '/observations/current';


    function requestTheData(){

        var options = {
          protocol: "https:",
          hostname: "https://api.weather.gov/",
          path: thePath,
          port: 80,
          method: "GET"
        };
        var instaRequest = https.request(options);

         instaRequest.on("response", function(res){
            console.log(`STATUS: ${res.statusCode}`);
            console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

            res.setEncoding('utf8');

            res.on('data', (chunk) => {
            console.log(`BODY: ${chunk}`);
            });

            res.on('end', () => {
            console.log('No more data in response.');
            });

          console.log("response");
          console.log(res.statusCode);
          console.log(res.statusMessage);
        });

        instaRequest.on('error', (e) => {
            console.error(`problem with request: ${e.message}`);
        });

        instaRequest.end();

    }

    requestTheData();

我收到此错误,无法弄清楚发生了什么:

problem with request: getaddrinfo ENOTFOUND https://api.weather.gov/stations/ https://api.weather.gov/stations/:80

2 个答案:

答案 0 :(得分:0)

HTTPS通常使用端口443,所以我们改变它。此外,API显示主机名应该是原始URL,路径应该是路径的其余部分(带有前导斜杠),类似于:

    thePath = '/stations/' + theStation + '/observations/current';

    ...

    var options = {
      hostname: "api.weather.gov",
      path: thePath,
      port: 443,
      method: "GET"
    };

答案 1 :(得分:0)

在看到任何答案之前我得到了它的工作: 协议:“https:”, 主机名:“api.weather.gov”,

然后我得到一个状态:      403禁止您无权访问      “http://api.weather.gov/”在此服务器上。

我似乎记得你需要通过标题传递内容,所以我在“方法:”GET“,”

下添加了这个内容。
          method: "GET",

          headers: {
            'Accept'       : 'application/json',  
            'Content-Type': 'application/json',
            'User-Agent'   : 'MY-UA-STRING'
          }

而且,瞧,现在我正在获取JSON天气数据。直到我添加'User-Agent'才行。你们知道这需要什么(和/或指向一个描述这个的地方)吗?