wake-up-neo.com

Aufrufen einer JSON-API mit Node.js

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)
66
Sven

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);
});
122
Laurent Perrin

Probleme mit anderen Antworten:

  • unsicherer JSON.parse
  • keine Überprüfung des Antwortcodes

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.

Beispiel mit 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);
    }
});

Beispiel mit 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);
});

Beispiel mit 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);
});

Zusammenfassung

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.

25
rsp

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)
  }
})
16

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);
})
4
MrMins

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)
    }
  })