使用JSONP找不到JSON_CALLBACK

时间:2013-05-15 09:00:47

标签: angularjs jsonp

我正在尝试使用以下代码获取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)它将运行。但我认为成功意味着代表我这样做。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

答案 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(这是服务器中的常见行为)。