使用Node.js调用JSON API


78

我正在尝试获取登录到我的应用程序中的用户的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)

Answers:


144

回调中的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);
});

res参数现在实际上是一个http.IncomingMessage对象。据我所知,ClientResponse类已经从节点的http库中重构出来了。
dmur 2015年

request模块将为您提供简单的http get / post / etc .. github.com/request/request
Soichi Hayashi

2
哇,这比我现在所期望的标准库的级别低。
elsurudo

3
JSON.parse()在无效的JSON上引发异常,应始终在try/catch块内调用它,否则整个程序可能会在无效数据上崩溃(有时会发生)。
rsp

为了避免必须做try/catchfor JSON.parse(如果使用,应该总是这样做JSON.parse-请参见此答案),您可以使用类似request这样的模块,该模块可以为您自动解析JSON,如我在下面的答案中所示。
rsp

44

其他答案有问题:

  • 不安全的 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-如果需要HTTP连接,只需更改httpshttp

'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。


17

我认为对于这样的简单HTTP请求,最好使用requestmodule。您需要使用npm(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)
  }
})

9

我正在使用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);
})

1

另一个解决方案是使用axios用户:

npm install axios

代码如下:

const url = `${this.env.someMicroservice.address}/v1/my-end-point`;

const { data } = await axios.get<MyInterface>(url, {
  auth: {
    username: this.env.auth.user,
    password: this.env.auth.pass
  }
});

return data;

0

Unirest库大大简化了这一过程。如果要使用它,则必须安装unirestnpm软件包。然后您的代码可能如下所示:

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)
    }
  })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.