使用 JSONP 未找到 JSON_CALLBACK
Posted
技术标签:
【中文标题】使用 JSONP 未找到 JSON_CALLBACK【英文标题】:JSON_CALLBACK not found using JSONP 【发布时间】:2013-05-09 18:38:27 【问题描述】:我正在尝试使用以下代码获取 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)
,它将运行。但我认为成功是为了代表我做到这一点。
【问题讨论】:
【参考方案1】:您的内容类型标头不正确。
如果您返回的是纯 JSON,请使用 application/json
。 JSONP 是 javascript,所以你应该使用application/javascript
【讨论】:
感谢您的回复,但我确实尝试过。我有同样的错误 我也是@tomwrong。我注意到它与文件的命名有关。我尝试更改我的 api(一个 php 文件)的名称,或者在 php 文件中将 JSON_CALLBACK 更改为 angular.callbacks._0。我认为这是一个角度的错误。 我认为这不是一个错误,我认为它提供了多个回调【参考方案2】:见angular $resource with jsonp not working 此issue已在git中打开:https://github.com/angular/angular.js/issues/1551
【讨论】:
【参考方案3】:我发现了这个 hack,它对我有用
//.......................ini: 哈克 /* 在您的 $http 请求之前复制粘贴此代码。 */ var c = $window.angular.callbacks.counter.toString(36); $window['angularcallbacks_' + c] = 函数(数据) $window.angular.callbacks['_' + c](data); 删除 $window['angularcallbacks_' + c]; ; //......................................结束:黑客 //你的 $http 请求 $http.jsonp(网址) .成功(函数() 控制台日志(“确定”) ) .error(函数(数据,状态,标题,配置) console.error("ko"); );【讨论】:
【参考方案4】:这是一个快速而肮脏的解决方案。您可以尝试输出angular.callbacks._0( date:'2013-05-15T08:53:51.747Z' )
,而不是输出JSON_CALLBACK( date:'2013-05-15T08:53:51.747Z' )
。我相信这是 Angular 中的错误。
另一种方法是通过这种方式请求您的网址:
$http(
method: 'JSONP',
url: 'https://something.com/' + '?callback=JSON_CALLBACK' + '&otherstuffs'
);
附言。如果您使用 php 后端,我注意到更改 php 文件的名称有时会产生积极的结果(例如,我们可以尝试使用 api.php,而不是使用 index.php)。虽然它似乎是完全随机的(什么名称有效,反之亦然) - 我认为这与 Angular 如何读取 json 的 url 有关。
看起来这个不幸的错误的原因是 Angular 会将 JSON_CALLBACK
替换为 angular.callbacks._0
,但它有时会由于其 URL 解释器而失败。
另外,即使成功,您使用的服务器也可能不支持 url 中的?callback=angular.callbacks._0
(这是服务器之间的常见行为)。
【讨论】:
以上是关于使用 JSONP 未找到 JSON_CALLBACK的主要内容,如果未能解决你的问题,请参考以下文章
node.js 中未定义 JSONP,使用 .send 会导致意外令牌错误
WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌: