我正在尝试使用以下代码获取JSONP响应...
$http.jsonp('http://example.com:8888/?callback=JSON_CALLBACK').success( function( response )
{
console.dir( response );
});
http://example.com:8888/?callback=JSON_CALLBACK通过node.js
返回以下内容JSON_CALLBACK({date:'2013-05-15T08:53:51.747Z'});
标头正在node.js中设置,就像这样....
res.writeHead(200, {'Content-Type': 'application/json'});
然而,我在Chrome控制台中遇到的错误是......
Uncaught ReferenceError: JSON_CALLBACK is not defined
然而,奇怪的是,如果我创建函数window.JSON_CALLBACK(response)
它将运行。但我认为成功意味着代表我这样做。
答案 0 :(得分:2)
您的内容类型标题不正确。
如果您返回的是纯JSON,请使用application/json
。 JSONP是Javascript,因此您应该使用application/javascript
答案 1 :(得分:0)
参见angular $resource with jsonp not working 此问题已在git:https://github.com/angular/angular.js/issues/1551
中打开答案 2 :(得分:0)
我找到了这个黑客,它对我有用
//.........................ini: Hack /* Copy-Paste this code just before your $http request. */ var c = $window.angular.callbacks.counter.toString(36); $window['angularcallbacks_' + c] = function (data) { $window.angular.callbacks['_' + c](data); delete $window['angularcallbacks_' + c]; }; //.........................end: Hack //Your $http request $http.jsonp(url) .success(function(){ console.log("ok") }) .error(function(data, status, headers, config){ console.error("ko"); });
答案 3 :(得分:0)
这是一个快速而肮脏的解决方案。您可以尝试输出JSON_CALLBACK({ date:'2013-05-15T08:53:51.747Z' })
,而不是输出angular.callbacks._0({ date:'2013-05-15T08:53:51.747Z' })
。我相信这是Angular中的错误。
另一种方法是以这种方式请求您的网址:
$http({
method: 'JSONP',
url: 'https://something.com/' + '?callback=JSON_CALLBACK' + '&otherstuffs'
});
PS。如果你使用php后端,我注意到更改php文件的名称有时会有正面结果(比如使用index.php我们可以尝试api.php)。虽然它似乎是完全随机的(什么名称有效,反之亦然) - 我认为这与Angular如何读取json的url有关。
看起来这个不幸的错误的原因是Angular会将JSON_CALLBACK
替换为angular.callbacks._0
,但由于其URL解释器,它有时会失败。
此外,即使它成功使用您正在使用的服务器也可能不支持URL中的?callback=angular.callbacks._0
(这是服务器中的常见行为)。