Ich versuche, das Facebook-Profilbild des Benutzers in meiner Anwendung einzuloggen. Die API von Facebook gibt an, dass http://graph.facebook.com/517267866/?fields=picture
die korrekte URL als JSON-Objekt zurückgibt.
Ich möchte die URL zum Bild aus meinem Code herausholen. Ich habe folgendes versucht, aber mir fehlt hier etwas.
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);
});
Das Ausführen dieses Codes führt zu folgendem Ergebnis:
undefined:1
^
SyntaxError: Unexpected token o
at Object.parse (native)
Das res
-Argument im http.get()
-Callback ist nicht der Body, sondern ein http.ClientResponse -Objekt. Sie müssen den Körper zusammenbauen:
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
Alle Antworten hier verwenden JSON.parse()
auf unsichere Weise . Sie sollten alle Aufrufe an JSON.parse()
immer in einem try/catch
-Block insbesondere ablegen, wenn Sie JSON von einer externen Quelle aus analysieren, wie Sie es hier tun .
Sie können request
verwenden, um die JSON automatisch zu analysieren, die hier nicht in anderen Antworten erwähnt wurde. Es gibt bereits eine Antwort mit dem Modul request
, aber es verwendet JSON.parse()
, um JSON manuell zu analysieren. Diese sollte always innerhalb eines try {} catch {}
-Blocks ausgeführt werden, um Fehler durch falsches JSON zu behandeln, oder die gesamte App stürzt ab. Und falsches JSON passiert, vertrau mir.
Andere Antworten, die http
verwenden, verwenden JSON.parse()
, ohne nach möglichen Ausnahmen zu suchen und Ihre Anwendung zum Absturz zu bringen.
Im Folgenden zeige ich einige Möglichkeiten, um sicher damit umzugehen.
Alle Beispiele verwenden eine öffentliche GitHub-API, sodass jeder diesen Code sicher ausprobieren kann.
request
Hier ist ein Arbeitsbeispiel mit request
, das JSON automatisch analysiert:
'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
und try/catch
Dies verwendet https
- ändern Sie einfach https
in http
, wenn Sie HTTP-Verbindungen wünschen:
'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
und tryjson
Dieses Beispiel ähnelt dem obigen, verwendet jedoch das Modul tryjson
. (Haftungsausschluss: Ich bin der Autor dieses Moduls.)
'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);
});
Das Beispiel, das request
verwendet, ist das einfachste. Wenn Sie es jedoch aus irgendeinem Grund nicht verwenden möchten, denken Sie daran, den Antwortcode immer zu überprüfen und JSON sicher zu analysieren.
Ich denke, für einfache HTTP-Anfragen wie diese ist es besser, das request
-Modul zu verwenden. Sie müssen es mit npm (npm install request
) installieren und dann kann Ihr Code so aussehen:
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)
}
})
Ich benutze get-json sehr einfach zu bedienen:
$ npm install get-json --save
get-json
importieren
var getJSON = require('get-json')
Um eine GET
-Anfrage auszuführen, würden Sie Folgendes tun:
getJSON('http://api.listenparadise.org', function(error, response){
console.log(response);
})
Unirest Bibliothek vereinfacht dies sehr. Wenn Sie es verwenden möchten, müssen Sie das Paket unirest
npm installieren. Dann könnte Ihr Code so aussehen:
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)
}
})