Aufrufen einer JSON-API mit Node.js.

78

Ich versuche, das Facebook-Profilbild des in meiner Anwendung angemeldeten Benutzers abzurufen. Die Facebook-API gibt an, dass http://graph.facebook.com/517267866/?fields=picturedie richtige URL als JSON-Objekt zurückgegeben wird.

Ich möchte die URL zum Bild aus meinem Code entfernen. Ich habe folgendes versucht, aber hier fehlt mir 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 folgenden Ergebnissen:

undefined:1

^
SyntaxError: Unexpected token o
    at Object.parse (native)
Sven
quelle

Antworten:

144

Das resArgument im http.get()Rückruf ist nicht der Hauptteil, 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);
});
Laurent Perrin
quelle
Das res-Argument ist jetzt tatsächlich ein http.IncomingMessage- Objekt. Soweit ich das beurteilen kann, wurde die ClientResponse-Klasse aus der http-Bibliothek des Knotens überarbeitet.
dmur
Anforderungsmodul kümmert sich um einfache http get / post / etc .. für Sie github.com/request/request
Soichi Hayashi
2
Wow, das ist niedriger als ich es heutzutage von einer Standardbibliothek erwarten würde.
Elsurudo
3
JSON.parse()löst Ausnahmen bei ungültigem JSON aus und sollte immer innerhalb eines try/catchBlocks aufgerufen werden, da sonst das gesamte Programm bei ungültigen Daten abstürzen kann (was manchmal vorkommt).
rsp
Um zu vermeiden, dass Sie ein try/catchfor ausführen müssen JSON.parse(was immer getan werden sollte, wenn Sie verwenden JSON.parse- siehe diese Antwort ), können Sie ein solches Modul verwenden request, das JSON automatisch für Sie analysiert, wie ich in meiner Antwort unten gezeigt habe.
rsp
44

Probleme mit anderen Antworten:

  • unsicher JSON.parse
  • Keine Überprüfung des Antwortcodes

Alle Antworten hier werden JSON.parse()auf unsichere Weise verwendet . Sie sollten immer alle Aufrufe JSON.parse()in einen try/catchBlock einfügen, insbesondere wenn Sie JSON analysieren, das von einer externen Quelle stammt, wie Sie es hier tun.

Sie können requestden JSON automatisch analysieren, was hier in anderen Antworten nicht erwähnt wurde. Es gibt bereits eine Antwort mit dem requestModul, aber es wird verwendet JSON.parse(), um JSON manuell zu analysieren. Dies sollte immer innerhalb eines try {} catch {}Blocks ausgeführt werden, um Fehler mit falschem JSON zu behandeln, da sonst die gesamte App abstürzt. Und falsches JSON passiert, vertrau mir.

Andere Antworten, die verwendet werden, werden httpebenfalls verwendet, JSON.parse()ohne nach Ausnahmen zu suchen, die auftreten und Ihre Anwendung zum Absturz bringen können.

Im Folgenden werde ich einige Möglichkeiten zeigen, wie Sie sicher damit umgehen können.

Alle Beispiele verwenden eine öffentliche GitHub-API, damit jeder diesen Code sicher ausprobieren kann.

Beispiel mit request

Hier ist ein Arbeitsbeispiel, mit requestdem JSON automatisch analysiert wird:

'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 httpundtry/catch

Dies verwendet https- ändern Sie einfach httpszu, httpwenn Sie HTTP-Verbindungen möchten:

'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 httpundtryjson

Dieses Beispiel ähnelt dem obigen, verwendet jedoch das tryjsonModul. (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 verwendete Beispiel requestist das einfachste. Wenn Sie es jedoch aus irgendeinem Grund nicht verwenden möchten, denken Sie daran, immer den Antwortcode zu überprüfen und JSON sicher zu analysieren.

rsp
quelle
17

Ich denke, dass es für einfache HTTP-Anfragen wie diese besser ist, das requestModul zu verwenden . Sie müssen es mit npm ( npm install request) installieren und dann kann Ihr Code folgendermaßen 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)
  }
})
Michał Perłakowski
quelle
9

Ich benutze get-json sehr einfach zu bedienen:

$ npm install get-json --save

Importieren get-json

var getJSON = require('get-json')

Um eine GETAnfrage zu stellen, würden Sie Folgendes tun:

getJSON('http://api.listenparadise.org', function(error, response){
    console.log(response);
})
MrMins
quelle
1

Eine andere Lösung ist für Benutzer Axios :

npm install axios

Der Code lautet wie folgt:

const url = `${this.env.someMicroservice.address}/v1/my-end-point`;

const { data } = await axios.get<MyInterface>(url, {
  auth: {
    username: this.env.auth.user,
    password: this.env.auth.pass
  }
});

return data;
Washington Guedes
quelle
0

Unirest Bibliothek vereinfacht dies sehr. Wenn Sie es verwenden möchten, müssen Sie das unirestnpm-Paket 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)
    }
  })
Michał Perłakowski
quelle