【问题标题】:Node HTTP request for Restful api's that return JSONP返回 JSONP 的 Restful api 的节点 HTTP 请求
【发布时间】:2012-02-22 00:49:45
【问题描述】:

我正在尝试使用 node.js 对 restful API 进行服务器端调用。使用 JSONP(JS 函数内的 JSON 容器)返回的返回错误似乎是节点 http.get(options, callback) API 的核心。节点或任何模块可以从 JSONP 返回返回 JSON 对象吗?

JSONP 请求示例: http://www.linkedin.com/countserv/count/share?url=http://techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-on-its-membership-community-for-entrepreneurs/

【问题讨论】:

  • 你能给出代码吗?我注意到 url 中没有回调引用。通常这看起来像 &callback=foo 或 &jsonp=bar。看起来 LinkedIn 响应了回调。然后,您可以使用 url.parse 找到该参数并采取相应措施。
  • request = require('request'); request({uri: 'graph.facebook.com/?ids=http://appsumo.com'}, function(err, responser, body){ myObject = eval('(' + body + ')'); };
  • 带有linkedin 的回调参数(&callback=functionName) 让我可以将包装函数更改为我希望的任何名称(但不能一起删除)。如果我能从 Node.js 下的 JS 模块或 API HTTP 请求获得有效响应(JSON 或 JSONP)。我会是一个快乐的人。

标签: http node.js jsonp


【解决方案1】:

我会编写一个包装函数来检查 JSON 并将函数从返回的字符串中剥离出来,以避免运行 eval。然后 JSON.parse 对字符串(现在减去我们删除它的函数)返回 json。

var request = require('request');
var getJsonFromJsonP = function (url, callback) {
request(url, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var jsonpData = body;
    var json;
    //if you don't know for sure that you are getting jsonp, then i'd do something like this
    try
    {
       json = JSON.parse(jsonpData);
    }
    catch(e)
    {
        var startPos = jsonpData.indexOf('({');
        var endPos = jsonpData.indexOf('})');
        var jsonString = jsonpData.substring(startPos+1, endPos+1);
        json = JSON.parse(jsonString);
    }
    callback(null, json);
  } else {
    callback(error);
  }
})
}

然后像这样使用它:

getJsonFromJsonP('http://www.linkedin.com/countserv/count/share?url=http://techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-on-its-membership-community-for-entrepreneurs/', function (err, data) {
    console.log('data count', data.count);
});

【讨论】:

  • 这应该作为 NPM 模块发布!
【解决方案2】:

使用vm执行回调

JavaScript code can be compiled and run immediately or compiled, saved, and run later

先前的答案建议剥离回调函数。不幸的是,这与许多 jsonp 响应不兼容,因为函数的内容通常是对象而不是纯 JSON。 JSON.parse() 函数将因以下原因而死:

callback({key:"value"});

虽然上面是一个有效的对象,但它不是有效的 JSON。

以下将执行回调并返回对象:

jsonpSandbox = vm.createContext({callback: function(r){return r;}});
myObject = vm.runInContext(jsonpData,jsonpSandbox);

创建上下文时,将 callback 更改为 jsonp 响应中返回的回调函数的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多