Вызов JSON API с узлом.js
Я пытаюсь получить изображение профиля facebook пользователя, вошедшего в мое приложение. API Facebook утверждает, что 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)
5 ответов:
The на
http.get()
обратный вызов-это не тело, а скорее http.ClientResponse
проблемы с другими ответы:
- небезопасных
JSON.parse
- нет проверки кода ответа
все ответы здесь использовать
JSON.parse()
на небезопасный способ. Вы всегда должны ставить все звонки наJSON.parse()
наtry/catch
блок особенно когда вы анализируете JSON, поступающий из внешнего источника, как вы делаете здесь.можно использовать
request
для автоматического разбора JSON, который не был упомянут здесь в другой ответ. Уже есть ответ с помощьюrequest
модуль, но он используетJSON.parse()
чтобы вручную разобрать JSON-который должен всегда будет работать внутриtry {} catch {}
блок для обработки ошибок неправильного JSON или в противном случае все приложение рухнет. И неправильный JSON случается, поверьте мне.другие ответы, которые используют
http
использоватьJSON.parse()
без проверки на наличие исключений, которые могут произойти и крах вашего приложения.ниже я покажу несколько способов справиться с этим безопасно.
все примеры используют публичный API GitHub, поэтому каждый может попробовать этот код безопасно.
пример
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
- просто изменитеhttps
до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
это самый простой. Но если по какой-то причине вы не хотите его использовать, то всегда проверяйте код ответа и безопасно анализируйте JSON.
Я думаю, что для простых 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) } })
я использую 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); })
библиотека 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) } })