为了账号安全,请及时绑定邮箱和手机立即绑定

使用Node.js调用JSON API

/ 猿问

使用Node.js调用JSON API

饮歌长啸 2019-11-13 14:44:29

我正在尝试获取登录到我的应用程序中的用户的Facebook个人资料图片。Facebook的API声明http://graph.facebook.com/517267866/?fields=picture返回正确的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)


查看完整描述

3 回答

?
哔哔one

回调中的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);

});


查看完整回答
反对 回复 2019-11-13
?
RISEBY

其他答案的问题:

不安全的 JSON.parse

没有响应代码检查

这里的所有答案都JSON.parse()以不安全的方式使用。您应该始终将所有调用都放在JSON.parse()一个try/catch块中,尤其是当您解析来自外部源的JSON时,就像您在此处所做的那样。


您可以使用它request来自动解析JSON,其他答案在此处未提到。已经有一个使用request模块的答案,但它用于JSON.parse()手动解析JSON-应该始终在一个try {} catch {}块内运行以处理不正确的JSON错误,否则整个应用程序将崩溃。发生不正确的JSON,请相信我。


使用的其他答案http也可以在JSON.parse()不检查可能发生的异常并使应用程序崩溃的情况下使用。


下面,我将介绍几种安全处理方式。


所有示例均使用公共GitHub API,因此每个人都可以安全地尝试该代码。


例子 request

这是一个request自动解析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);

    }

});

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是最简单的


查看完整回答
反对 回复 2019-11-13
?
烧仙草VB

我认为对于这样的简单HTTP请求,最好使用requestmodule。您需要使用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)

  }

})


查看完整回答
反对 回复 2019-11-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信