我正在尝试使用node.js对服务器端调用restful API。使用JSONP(JS函数内的JSON容器)返回返回的错误,这似乎是节点http.get(options,callback)API的核心。节点或任何模块是否可以从JSONP返回JSON对象?节点返回JSONP的Restful api的HTTP请求
10
A
回答
6
我会写来检查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);
});
8
与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响应返回的回调函数的名称。
+2
briliant。完美的作品。 – 2015-03-19 17:15:27
相关问题
- 1. RESTful HATEOAS API中的HTTP POST请求
- 2. 节点JS上的HTTP请求回调与节点JS
- 3. 节点API请求
- 4. HTTPS到HTTP JSONP请求
- 5. ECONNREFUSED,节点HTTP GET请求
- 6. 如何从WCP请求返回JSONP?
- 7. POST请求节点返回404
- 8. 节点JS使用数据从请求/请求API调用返回
- 9. 节点google api不返回'请求'对象
- 10. 节点api不返回数据给客户端ajax请求
- 11. ScriptResource.axd请求返回HTTP 302
- 12. 对Yelp API的HTTP请求返回缺少的参数错误
- 13. 节点HTTPS请求不返回Lambda中的回调函数
- 14. Asynchronus HTTP请求返回Swift中的值
- 15. Yammer API请求返回401
- 16. API GET请求返回404
- 17. 节点 - 简单的XML API请求
- 18. 节点中的JS Api请求循环
- 19. PHP - 保护RESTful API请求
- 20. 如何将JSON HTTP请求POST到WCF制作的RESTful API
- 21. Jetty在http请求中返回400请求绝对URL请求
- 22. runModalForWindow节流的HTTP请求
- 23. Angular2 Http/Jsonp无法提出请求
- 24. 代理http请求与节点
- 25. 节点js多个http异步请求
- 26. 从节点HTTP请求中删除端口号至外部API
- 27. Laravel RESTful服务的大量API请求
- 28. 如何解析从请求返回的JSONp?
- 29. 节点请求返回不同的结果
- 30. 节点模块“请求”返回不完整的HTML
你能不能代码?我注意到在url中没有回调引用。通常这看起来像&callback = foo或&jsonp = bar。 LinkedIn看起来像回应回应。然后,您可以使用url.parse来查找该参数并采取相应措施。 – booyaa 2012-01-30 11:35:07
request = require('request'); request({uri:'http://graph.facebook.com/?ids=http://appsumo.com'},function(err,responser,body){myObject = eval('('+ body +') )'); }; – user690740 2012-02-02 11:15:45
带有linkedin的回调参数(&callback = functionName)让我可以将包装器函数更改为我希望的任何名称(但不能将它们一起移除)如果我能得到有效的响应(JSON或JSONP)从模块或API HTTP请求与JS下的节点。我会是一个快乐的人。 – user690740 2012-02-02 11:19:47