使用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); } });
http
和try/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); });
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
的示例是最简单的。 但是,如果由于某种原因,你不想使用它,那么记得总是检查响应代码,并安全地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) } })