使用Node.js调用JSON API

我想获取login到我的应用程序的用户的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) 

http.get()callback中的res参数不是主体,而是一个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); }); 

与其他答案的问题:

  • 不安全的JSON.parse
  • 没有响应代码检查

这里的所有答案都以不安全的方式使用JSON.parse() 。 你应该总是把所有对JSON.parse()调用放在一个try/catch块中, 特别是当你parsing来自外部源的JSON时,就像你在这里做的那样。

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

使用http其他答案也使用JSON.parse()而不检查可能发生的exception并使应用程序崩溃。

下面我将展示几种安全处理的方法。

所有示例都使用公共GitHub API,因此每个人都可以安全地尝试该代码。

request示例

以下是一个自动parsingJSON的request示例:

 '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 – 只要将HTTP更改为http如果你想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的示例是最简单的。 但是,如果由于某种原因,你不想使用它,那么记得总是检查响应代码,并安全地parsingJSON。

我认为对于这样简单的HTTP请求,最好使用request模块 。 你需要用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) } }) 

不公平的图书馆简化了这一点。 如果你想使用它,你必须安装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) } })