【问题标题】:Angularjs JSONP not workingAngularjs JSONP不起作用
【发布时间】: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 文件,其对象字面量在以您传递的回调命名的函数内返回。

标签: angularjs jsonp


【解决方案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 urlthis one 的结果,查看浏览器中JSON 和JSONP 响应之间的区别。
  • 查看开发者工具中的Chrome Network Panel,以帮助比较您的请求/响应并进行故障排除。

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

【讨论】:

  • 感谢 TheHippo!非常有用的 cmets。
  • @Gloopy - 有用的信息和示例 jsfiddle 对调试我的代码非常有帮助,非常感谢。
  • 终于找到了一个可行的解决方案!使用 smartthings 只是为了在此处删除关键字而遇到了这个问题。
  • 不幸的是,用于此示例的 Youtube 服务不再有效。 stackoverflow.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完全没有关系
猜你喜欢
  • 2015-04-12
  • 2012-07-04
  • 1970-01-01
  • 2015-07-06
  • 2016-03-05
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多