アプリケーションにログインしているユーザーの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)
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);
});
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);
}
});
http
とtry/catch
の例これはhttps
を使用します。HTTP接続が必要な場合は、単に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を安全に解析することを忘れないでください。
このような単純な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)
}
})
私は 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);
})
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)
}
})