Angularjs JSONP不起作用

Posted

技术标签:

【中文标题】Angularjs JSONP不起作用【英文标题】:Angularjs JSONP not working 【发布时间】:2013-04-27 00:46:06 【问题描述】:

我可能在这里遗漏了一些东西,但我无法使这个 JSONP 请求工作,这里是代码:

var url =  'http://' + server + '?callback=JSON_CALLBACK';
$http.jsonp(url)
    .success(function(data)
       console.log('success');
    )
    .error(function () 
      console.log('error')
    );

请求触发正常,我收到以下格式的响应(带有标头 Content-Type:application/json):

    ["id": "1", "name": "John Doe",
     "id": "2", "name": "Lorem ipsum",
     "id": "3", "name": "Lorem ipsum"]

你能看出什么不对吗?也许我应该从服务器返回的格式不正确? 除了我设置的错误消息('error')之外,Angular 触发错误回调没有任何错误消息。

【问题讨论】:

你能发一个 Plunker 吗? 你在 fiddler 或 firebug 中看到了什么反应 响应看起来不对,应该是对请求指定的回调函数的函数调用 @joakimbl 是正确的。那不是 JSONP,那只是 JSON。您的响应应该是一个 javascript 文件,其对象字面量在以您传递的回调命名的函数内返回。 【参考方案1】:

@TheHippo 是正确的,数据不应该只是简单的 json 响应。 Here is a working example 针对 AngularJS 中的 youtube 端点的 JSONP 请求。

在这个例子中有几点需要注意:

Angular 的$http.jsonp 将请求查询字符串参数从callback=JSON_CALLBACK 转换为callback=angular.callbacks._0。 调用 youtube 端点时,我需要通过在查询字符串中使用 alt=json-in-script 而不是 alt=json 向服务指定这是一个 JSONP 请求。这是在他们的documentation. 中找到的 比较this url 和this one 的结果,查看浏览器中JSON 和JSONP 响应之间的区别。 查看开发者工具中的Chrome Network Panel,以帮助比较您的请求/响应并进行故障排除。

我知道这个示例非常具体,但希望对您有所帮助!

【讨论】:

感谢 TheHippo!非常有用的 cmets。 @Gloopy - 有用的信息和示例 jsfiddle 对调试我的代码非常有帮助,非常感谢。 终于找到了一个可行的解决方案!使用 smartthings 只是为了在此处删除关键字而遇到了这个问题。 不幸的是,用于此示例的 Youtube 服务不再有效。 ***.com/a/30685729/1014710 表明可以使用 Google Developers API 密钥来完成。【参考方案2】:

JSONP 要求您将数据包装到 JavaScript 函数调用中。所以从技术上讲,您返回的是 JavaScript 文件而不是 Json 文件。

从服务器返回的数据应该是这样的:

// the name should match the one you add to the url
JSON_CALLBACK([
    "id": "1", "name": "John Doe",
    "id": "2", "name": "Lorem ipsum",
    "id": "3", "name": "Lorem ipsum"
]);

编辑:如果其他人偶然发现 Angular 的 JSONP 问题,请同时阅读this answer to this question,它包含有关 Angular 如何处理实际回调函数的有用信息。

【讨论】:

解决了!谢谢。 TheHippo 如果您可以编辑您的答案以包含@Gloopy 评论的内容:“Angular 的 $http.jsonp 将请求查询字符串参数从 callback=JSON_CALLBACK 转换为 callback=angular.callbacks._0”,因此响应不完全是 JSON_CALLBACK() 而是 angular .callbacks._0([ "id":"1", "name":"John Doe", "id":"2", "name":"Lorem ipsum"]);如果有多个请求,则第二个 jsonp 将请求 querystring callback=JSON_CALLBACK 转换为 angular.callbacks._1 等等,所以在我的情况下(php 服务器)我使用 $_GET['callback'] 来获得正确的回调名字。【参考方案3】:

如果响应数据是“纯”JSON,我们可以使用 Angular 的 $http.get 来处理它。

$http.get(url).
  then(function(response) 
    // this callback will be called asynchronously
    // when the response is available
    $scope.responseArray = response.data;
 , function(response) 
    // called asynchronously if an error occurs
    // or server returns response with an error status.
 );

参考w3schools上的例子

【讨论】:

仅当您设置了 CORS 时 这个和jsonp完全没有关系

以上是关于Angularjs JSONP不起作用的主要内容,如果未能解决你的问题,请参考以下文章

来自url的Angularjs json不起作用,但在本地工作

为啥 JsonP 不起作用? [复制]

JSONP回调不起作用

简单的 JSONP 和 PHP 示例不起作用

带有远程 URL 的 JSONP 不起作用

带有 Sencha Touch 的 JSONP 不起作用