返回 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 请求的主要内容,如果未能解决你的问题,请参考以下文章
AJAX、RESTful/Rest、JSON 和 JSONP 有啥区别?