87

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

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

6 に答える 6

158

コールバックのres引数http.get()は本体ではなく、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);
});
于 2012-08-06T10:27:42.700 に答える
52

他の回答の問題:

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

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

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

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

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

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

request

requestJSON を自動的に解析する実際の例を次に示します。

'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とを使用した例try/catch

これは使用します-HTTP接続が必要な場合は次のようhttpsに変更httpsします: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);
});

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

于 2016-09-21T09:15:46.423 に答える
19

このような単純な HTTP リクエストには、requestモジュールを使用する方がよいと思います。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)
  }
})
于 2015-08-31T00:47:30.130 に答える
0

Unirest ライブラリはこれを大幅に簡素化します。使いたい場合は、unirestnpm パッケージをインストールする必要があります。次に、コードは次のようになります。

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)
    }
  })
于 2016-05-15T13:26:09.837 に答える