调用带有Node.js的一个JSON API(Calling a JSON API with Nod

2019-06-17 16:04发布

我试图让登录到我的应用程序的用户的Facebook的个人资料图片。 Facebook的API指出http://graph.facebook.com/517267866/?fields=picture返回正确的URL作为JSON对象。

我想获得的URL画面出我的代码。 我尝试以下,但我在这里失去了一些东西。

 var url = 'http://graph.facebook.com/517267866/?fields=picture';

 http.get(url, function(res) {
      var fbResponse = JSON.parse(res)
      console.log("Got response: " + fbResponse.picture);
    }).on('error', function(e) {
      console.log("Got error: " + e.message);
 });

运行在下面这段代码的结果:

undefined:1

^
SyntaxError: Unexpected token o
    at Object.parse (native)

Answer 1:

所述res在参数http.get()回调不是机构,而是一个http.ClientResponse对象。 你需要组装体:

var url = 'http://graph.facebook.com/517267866/?fields=picture';

http.get(url, function(res){
    var body = '';

    res.on('data', function(chunk){
        body += chunk;
    });

    res.on('end', function(){
        var fbResponse = JSON.parse(body);
        console.log("Got a response: ", fbResponse.picture);
    });
}).on('error', function(e){
      console.log("Got an error: ", e);
});


Answer 2:

与其他问题的答案:

  • 不安全JSON.parse
  • 无响应代码检查

所有的答案在这里使用JSON.parse()不安全的方式 。 你应该总是把所有来电JSON.parse()在一个try/catch尤其是当你解析JSON从外部源的到来,就像你在这里做。

您可以使用request自动解析JSON这是不是在其他的答案这里提到。 已经有使用应答request模块,但它使用JSON.parse()手动解析JSON -这应该总是一个内部运行try {} catch {}块来处理不正确JSON的错误或否则整个应用程序会崩溃。 和不正确的JSON情况发生,相信我。

使用其他的答案http也使用JSON.parse() ,不检查,可以发生和崩溃的应用程序异常。

下面我将介绍一些方法来安全地处理它。

所有的例子都使用一个公共GitHub的API,这样每个人都可以放心地尝试代码。

例如与request

下面是从一个工作示例request ,可以自动解析JSON:

'use strict';
var request = require('request');

var url = 'https://api.github.com/users/rsp';

request.get({
    url: url,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    if (err) {
      console.log('Error:', err);
    } else if (res.statusCode !== 200) {
      console.log('Status:', res.statusCode);
    } else {
      // data is already parsed as JSON:
      console.log(data.html_url);
    }
});

与实例httptry/catch

这将使用https -只是改变httpshttp如果你想HTTP连接:

'use strict';
var https = require('https');

var options = {
    host: 'api.github.com',
    path: '/users/rsp',
    headers: {'User-Agent': 'request'}
};

https.get(options, function (res) {
    var json = '';
    res.on('data', function (chunk) {
        json += chunk;
    });
    res.on('end', function () {
        if (res.statusCode === 200) {
            try {
                var data = JSON.parse(json);
                // data is available here:
                console.log(data.html_url);
            } catch (e) {
                console.log('Error parsing JSON!');
            }
        } else {
            console.log('Status:', res.statusCode);
        }
    });
}).on('error', function (err) {
      console.log('Error:', err);
});

例如具有httptryjson

这个例子是与上述类似但使用tryjson模块。 (免责声明:我是模块的作者。)

'use strict';
var https = require('https');
var tryjson = require('tryjson');

var options = {
    host: 'api.github.com',
    path: '/users/rsp',
    headers: {'User-Agent': 'request'}
};

https.get(options, function (res) {
    var json = '';

    res.on('data', function (chunk) {
        json += chunk;
    });

    res.on('end', function () {
        if (res.statusCode === 200) {
            var data = tryjson.parse(json);
            console.log(data ? data.html_url : 'Error parsing JSON!');
        } else {
            console.log('Status:', res.statusCode);
        }
    });
}).on('error', function (err) {
      console.log('Error:', err);
});

摘要

使用该示例request是最简单的。 但是,如果由于某种原因,你不想使用它,然后记得要经常检查响应代码和安全地解析JSON。



Answer 3:

我认为,像这样简单的HTTP请求,最好使用request模块 。 你需要与故宫安装( npm install request ),然后你的代码可以是这样的:

const request = require('request')
     ,url = 'http://graph.facebook.com/517267866/?fields=picture'

request(url, (error, response, body)=> {
  if (!error && response.statusCode === 200) {
    const fbResponse = JSON.parse(body)
    console.log("Got a response: ", fbResponse.picture)
  } else {
    console.log("Got an error: ", error, ", status code: ", response.statusCode)
  }
})


Answer 4:

我使用GET JSON的使用非常简单:

$ npm install get-json --save

进口get-json

var getJSON = require('get-json')

做一个GET请求,你会做这样的事情:

getJSON('http://api.listenparadise.org', function(error, response){
    console.log(response);
})


Answer 5:

Unirest库简化了这个有很多。 如果你想使用它,你必须安装unirest NPM包。 然后,你的代码看起来是这样的:

unirest.get("http://graph.facebook.com/517267866/?fields=picture")
  .send()
  .end(response=> {
    if (response.ok) {
      console.log("Got a response: ", response.body.picture)
    } else {
      console.log("Got an error: ", response.error)
    }
  })


文章来源: Calling a JSON API with Node.js