从FF中的file://URL加载的单个HTML/JS(jQuery)应用程序可以进行网络调用并接收响应,但响应体是空的



我有一个简单的应用程序,我正在一个网页上编写,它只能在网络共享上运行。它的目的是从Web服务中获取数据并将其很好地呈现出来。我正在我的本地电脑上用Firefox 26.0设计它。我正在使用jQuery来帮助解决这个问题。返回的数据是XML(来自jira、fwiw)。

正在进行呼叫,服务器正在接收响应。FF网络开发工具告诉我响应是200 OK。但是,响应主体是空的。每次都会调用错误回调。

代码:

$.ajax({
type: "GET",
url: "http://myjiraserver?lalalalala",
dataType: "xml",
crossDomain: true,
processData : false,
success: function(response) {
var result = "";
$(response).find("item type").map( function() {
if (this.text == "Risk") {
result += "<p>" + this.text + "</p>";
}
} );
$("#test").html(result);
},
error: function(xhr, status, error) {
alert('Error:  status = ' + xhr.responseText + " " + error + " " + status );
}
});

我在IE8中运行了相同的代码,它得到了响应,jQuery成功地解析了响应。(我想在IE8中开发它,但我需要FF的开发工具;chrome在这台电脑上不起作用——另一回事)

鉴于我知道Web服务正在运行,而js在IE中运行,我的工作理论是这是某种跨领域的问题,但我真的不知道!

你知道问题可能是什么吗?关于如何解决它的建议?

它在IE中工作的事实是因为JQuery在IE中使用activex而不是XmlHttpRequest来处理ajax请求。标准XHR请求不允许本地文件访问远程服务器(反之亦然)。

即使您的代码是从web服务器上运行的,这在firefox或chrome中也不起作用。我看到你在使用"crossDomain"参数,但你误解了它

crossDomain(默认值:相同域请求为false,跨域请求为true)类型:布尔如果希望在同一域上强制执行跨域请求(如JSONP),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域。(增加版本:1.5)

因此,如果您使用的是jsonp,则将crossDomain设置为true,但使用的是跨域资源的本地服务器端重定向。

通常,要通过javascript访问跨域api,您可以使用JSONP,也可以使用CORS(跨源资源共享),不幸的是,jira不支持这两种方法。(本文指出Jira已经有效地扼杀了javascript API访问)。第三种选择是,您可以设置一个中间人服务器来获取数据并将其返回到本地页面。中间的手册页必须启用CORS。以下是如何在PHP中启用CORS标头的示例:CORS与PHP标头

然后,您的javascript必须引用您的中间人页面,并将您想要访问的api页面传递给它:

$.ajax({
type: "GET",
url: "http://middeman.com?page="+escape( 'http://myjiraserver?lalalalala' )+"&method=GET"
...
);

最新更新