angularjs jsonp 在本地不起作用

Posted

技术标签:

【中文标题】angularjs jsonp 在本地不起作用【英文标题】:angularjs jsonp don't work localy 【发布时间】:2012-07-04 19:19:28 【问题描述】:

我尝试了一个 Angular 演示并想玩 jsonp,但我无法让它工作,所以我将相同的代码粘贴到 jsbin 中,这样我可以问你们有什么问题。请注意它确实有效。

在我的开发站点上再次尝试了完全相同的代码。它不起作用。我可以在 webkit 中看到网络日志,我用 http 代码 200 返回了一个有效的 json。但是没有执行回调。

我最终在同一个请求上尝试了 jQuery-Ajax,并且效果很好。对我来说

$(document).ready(function() 
    $.getJSON('http://angularjs.org/greet.php?callback=?&name=Super%20Hero', function(data) 
        console.log(data); // Works
    );
);

这是我的代码的演示,它不能在本地运行 http://jsbin.com/ojibel/edit#html,live.

编辑:

我从 .html 切换到 .php 扩展名,它开始工作了。所以它必须与apache做点什么?

【问题讨论】:

【参考方案1】:

在 JQUERY api doc 中提到

“但是,由于 JSONP 和跨域 GET 请求不使用 XHR,在这些情况下,传递给成功回调的 jqXHR 和 textStatus 参数是未定义的。”

我在http://jsbin.com/ojibel/3/edit修改了你的代码

如果您看到我创建了一个名为 getData 的函数,并且我将其作为回调 URL 传递,因此我可以在控制台中显示它。

JSONP 的工作方式是尝试将 URL 添加为脚本标签,并将 URL 的输出视为脚本,并且代码按原样执行。所以如果你有回电 xyx 在输出中你会得到类似

xyz(DATA_FROM_SERVER)

相同
<script>xyz(DATA_FROM_SERVER)</script>

【讨论】:

效果很好,但我对此并不满意。例如,我无法访问其他参数,例如 xhr.status 等 如果您尝试访问跨域,则无法访问 xhr.status 或任何其他回调。再次请通过 jquery 所说的工作原理。 ------------------- "但是,由于 JSONP 和跨域 GET 请求不使用 XHR,在这些情况下传递给成功回调的 jqXHR 和 textStatus 参数是未定义的。”因此,在进行跨域时,无法获得它们。 JSONP 不是 ajax。跨域 AJAX 根本不可能。你需要明白这一点。【参考方案2】:

当您说它“不起作用”时,您能描述一下您正在采取的步骤以及预期与实际的结果是什么?

请注意,在您的示例中,您将 $http 与 $templateCache 一起使用,并且在 html 文件的底部有 &lt;script type="text/ng-template" id="http-hello.html"&gt;Hello, $http!&lt;/script&gt;,它将使用 http-hello.html 请求的响应填充缓存,所以如果您获取 / http-hello.html,将不会向服务器发出请求,并且将使用缓存的内容调用回调。

【讨论】:

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

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

angularjs - 返回 JSONP 时不执行 HTTPpromise

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

JSONP回调不起作用

带有远程 URL 的 JSONP 不起作用

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