如何使用Node.js调用JSON API?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (67)

我试图获取登录到我的应用程序的用户的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)
提问于
用户回答回答于

回调中的res参数http.get()不是主体,而是一个http.ClientResponse对象。你需要组装body:

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);
});
用户回答回答于

其他答案的问题:

  • 不安全 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);
    }
});

http和的例子try/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);
});

http和的例子tryjson

此示例与上述类似,但使用该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。

扫码关注云+社区

领取腾讯云代金券