94 votes

Appeler une API JSON avec Node.js

J'essaie d'obtenir la photo de profil Facebook de l'utilisateur connecté à mon application. L'API de Facebook indique que http://graph.facebook.com/517267866/?fields=picture renvoie l'URL correcte sous la forme d'un objet JSON.

Je veux extraire l'URL de l'image de mon code. J'ai essayé ce qui suit mais il me manque quelque chose.

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

L'exécution de ce code donne le résultat suivant :

undefined:1

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

164voto

Laurent Perrin Points 5396

En res dans l'argument de la http.get() n'est pas le corps, mais plutôt une http.ClientResponse objet. Vous devez assembler le corps :

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

57voto

rsp Points 11526

Problèmes avec les autres réponses :

  • non sécurisé JSON.parse
  • vérification du code de non-réponse

Toutes les réponses ici utilisent JSON.parse() dans un manière dangereuse . Vous devez toujours mettre tous les appels à JSON.parse() dans un try/catch bloc notamment lorsque vous analysez le JSON provenant d'une source externe, comme vous le faites ici.

Vous pouvez utiliser request pour analyser le JSON automatiquement, ce qui n'a pas été mentionné dans les autres réponses. Il existe déjà une réponse utilisant request mais il utilise JSON.parse() pour analyser manuellement le JSON - ce qui devrait siempre être exécuté à l'intérieur d'un try {} catch {} pour gérer les erreurs de JSON incorrect, sinon l'application entière se plantera. Et un JSON incorrect, ça arrive, croyez-moi.

Autres réponses qui utilisent http utiliser également JSON.parse() sans vérifier les exceptions qui peuvent se produire et faire planter votre application.

Je vais vous montrer ci-dessous quelques façons de le faire en toute sécurité.

Tous les exemples utilisent une API GitHub publique afin que chacun puisse essayer ce code en toute sécurité.

Exemple avec request

Voici un exemple fonctionnel avec request qui analyse automatiquement le 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);
    }
});

Exemple avec http y try/catch

Cela utilise https - juste changer https à http si vous voulez des connexions 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);
});

Exemple avec http y tryjson

Cet exemple est similaire au précédent, mais utilise l'option tryjson module. (Avertissement : je suis l'auteur de ce module).

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

Résumé

L'exemple qui utilise request est le plus simple. Mais si, pour une raison quelconque, vous ne souhaitez pas l'utiliser, n'oubliez pas de toujours vérifier le code de réponse et d'analyser JSON en toute sécurité.

19voto

Gothdo Points 4842

Je pense que pour les requêtes HTTP simples comme celle-ci, il est préférable d'utiliser la fonction request module . Vous devez l'installer avec npm ( npm install request ) et votre code peut alors ressembler à ceci :

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

13voto

MrMins Points 5677

J'utilise get-json très simple à utiliser :

$ npm install get-json --save

Importation get-json

var getJSON = require('get-json')

Pour faire un GET vous feriez quelque chose comme :

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

3voto

Washington Guedes Points 2285

Une autre solution consiste à utiliser axios :

npm install axios

Le code sera comme :

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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X