返回 JSONP 的 Restful api 的节点 HTTP 请求

Posted

技术标签:

【中文标题】返回 JSONP 的 Restful api 的节点 HTTP 请求【英文标题】:Node HTTP request for Restful api's that return JSONP 【发布时间】: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)。我会是一个快乐的人。 【参考方案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 响应中返回的回调函数的名称。

【讨论】:

以上是关于返回 JSONP 的 Restful api 的节点 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

Web开发中怎么用RESTful做后端API

Web开发中怎么用RESTful做后端API

RESTFUL协议

AJAX、RESTful/Rest、JSON 和 JSONP 有啥区别?

WEB API HttpResponseMessage 返回 JSONP

Express api res.jsonp 返回双重回调