web-dev-qa-db-ja.com

Node.jsでJSON APIを呼び出す

アプリケーションにログインしているユーザーのFacebookプロフィール写真を取得しようとしています。 FacebookのAPIでは、http://graph.facebook.com/517267866/?fields=pictureはJSONオブジェクトとして正しいURLを返すと述べています。

コードから画像の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)
69
Sven

http.get()コールバックのres引数は、本文ではなく、 http.ClientResponse オブジェクトです。本体を組み立てる必要があります。

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

他の回答の問題:

  • 安全でないJSON.parse
  • 応答コードチェックなし

ここでのすべての答えは、JSON.parse()安全でない方法で使用しています。ここで行うように、外部ソースからのJSONを解析するときは、常にJSON.parse()へのすべての呼び出しをtry/catchブロック特にに入れる必要があります。

requestを使用して、ここで他の回答で言及されなかったJSONを自動的に解析できます。 requestモジュールを使用した回答は既にありますが、JSON.parse()を使用してJSONを手動で解析します-これはtry {} catch {}ブロック内でalwaysを実行して不正なJSONのエラーを処理する必要がありますそうしないと、アプリ全体がクラッシュします。そして、間違ったJSONが発生します、私を信じてください。

httpを使用する他の回答も、アプリケーションをクラッシュさせる可能性のある例外をチェックせずにJSON.parse()を使用します。

以下に、安全に処理するいくつかの方法を示します。

すべての例でパブリックGitHub APIを使用しているため、誰もが安全にコードを試すことができます。

requestを使用した例

JSONを自動的に解析するrequestを使用した実用的な例を次に示します。

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

httptry/catchの例

これはhttpsを使用します。HTTP接続が必要な場合は、単にhttpshttpに変更します。

'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を安全に解析することを忘れないでください。

33
rsp

このような単純なHTTPリクエストには、 request module を使用した方が良いと思います。 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)
  }
})
16

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

nirestライブラリ は、これを大幅に簡素化します。使用する場合は、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)
    }
  })