使用 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的主要内容,如果未能解决你的问题,请参考以下文章

JSONP 回调方法未定义

node.js 中未定义 JSONP,使用 .send 会导致意外令牌错误

Jsonp 回调问题:输入文本未定义

WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:

使用 jQuery 在 Android 2.2.2 上的浏览​​器未获取 JSONP

使用带有 JSONP 的 AJAX 未捕获的 SyntaxError 和 CORS 错误