【问题标题】:JSON_CALLBACK not found using JSONP使用 JSONP 未找到 JSON_CALLBACK
【发布时间】: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),它将运行。但我认为成功是为了代表我做到这一点。

【问题讨论】:

    标签: angularjs jsonp


    【解决方案1】:

    您的内容类型标头不正确。

    如果您返回的是纯 JSON,请使用 application/json。 JSONP 是 Javascript,所以你应该使用application/javascript

    【讨论】:

    • 感谢您的回复,但我确实尝试过。我有同样的错误
    • 我也是@tomwrong。我注意到它与文件的命名有关。我尝试更改我的 api(一个 php 文件)的名称,或者在 php 文件中将 JSON_CALLBACK 更改为 angular.callbacks._0。我认为这是一个角度的错误。
    • 我认为这不是一个错误,我认为它提供了多个回调
    【解决方案2】:
    【解决方案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(这是服务器之间的常见行为)。

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 2014-05-26
        • 2012-07-09
        • 2015-07-02
        • 2011-01-23
        • 2014-01-01
        相关资源
        最近更新 更多