【问题标题】:Cross domain javascript ajax request - status 200 OK but no response跨域 javascript ajax 请求 - 状态 200 OK 但没有响应
【发布时间】:2011-08-11 23:05:23
【问题描述】:

这是我的情况: 我创建了一个小部件,站点管理员可以将其嵌入到他们的站点中,并且数据存储在我的服务器中。所以脚本基本上必须向我服务器中的 php 文件发出 ajax 请求来更新数据库。对?对 :) 当我在我的 本地服务器 中运行 ajax 请求 效果很好 但是当 php 文件在我的 ONLINE 上时它确实不起作用 服务器。 这是我使用的代码:

var url = "http://www.mydomain.net/ajax_php.php";
var params = "com=ins&id=1&mail=mymail@site.net";
http.async = true;
http.open("POST", url, true);       

http.onreadystatechange = function() {

    if(http.readyState == 4 && http.status == 200) {

    //do my things here
    alert( http.responseText ); 

    }
}
http.send(params);

在萤火虫中显示:http://www.mydomain.net/ajax_php.php 200 OK X 600ms。

当我检查 ajax responnseText 时,我总是得到一个 Status:0

现在我的问题是:“我可以默认执行跨域 ajax 请求吗?这可能是跨域 ajax 问题吗?因为它在请求的文件驻留在我的本地服务器中时有效,但在请求时无效文件在另一台服务器上,我认为对另一台远程服务器的 ajax 请求可能会被拒绝?你能帮我澄清一下吗? 谢谢..

【问题讨论】:

  • 您可能想要投票和/或接受对您有帮助的答案。它会稍微增加您的代表以及您的回答接受率,这会在您提出更多问题时有所帮助。 (更高的百分比会吸引更多的人回答问题。)

标签: ajax


【解决方案1】:

不允许直接跨域请求。但是,有一种称为JSONP 的常用技术可以让您通过使用脚本标签来避免这种限制。基本上,您创建一个具有已知名称的回调函数:

function receiveData(data) {
    // ...
}

然后您的服务器将 JSON 数据包装在一个函数调用中,如下所示:

receiveData({"the": "data"});

然后您通过向您的页面添加script 标记来“调用”跨域服务器。 jQuery 在其 ajax 函数中优雅地包装了所有这些。

我有时不得不使用的另一种技术是通过 iframe 进行跨文档通信。您可以通过postMessage 以受限的方式让一个窗口与另一个窗口对话,甚至可以跨域对话。请注意,只有最近的浏览器才有此功能,因此如果不求助于骇客,该选项并非在所有情况下都可行。

【讨论】:

  • 天哪!这是有史以来最快的回复 :) 感谢您澄清 Jacob。我会尝试了解 JSONP 是如何工作的,如果我需要进一步的帮助,我可能会回来问这里......这样一个很棒的社区 :)
  • 我用谷歌搜索了这个例子,这个例子超级容易理解onlinesolutionsdevelopment.com/blog/web-development/javascript/…这正是你的意思@Jacob?
  • 是的。很高兴你发现了一些容易理解的东西。
【解决方案2】:

您需要通过JSONP 电话将您的回复发送回您的客户。

您需要做的是将您对数据的请求包装在脚本标记中。您的服务器将响应包含在函数调用中的数据。通过将脚本下载为外部资源,您的浏览器将执行脚本(就像添加对外部 JS 文件(如 jQuery)的引用)并将数据传递给已知的 JS 方法。然后,您的 JS 方法将获取数据并执行您需要执行的任何操作。

涉及很多步骤。使用像 jQuery 这样的库可以为此提供很多支持。

希望这会有所帮助。

【讨论】:

  • 感谢@David 我知道 jQuery 更简单,但我的小部件必须嵌入到可能加载或未加载 jQuery 的其他站点中。我不想动态加载 jQuery,但我选择了“普通”javascript 来更快地完成这项工作。我想我找到了需要的示例,我在 cmets 中发布了它:)
  • @Albo - 明白。我只是提到了框架;并不意味着您应该使用它。我认为您在没有框架的情况下这样做很棒 - 绝对让您了解正在发生的事情。许多人只是认为他们可以使用 jQuery,添加一个 jsonp 数据类型,然后一切都“正常工作”。绝对不是这样。
  • 感谢您的帮助@David。再次感谢:)
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2015-09-30
  • 1970-01-01
  • 2019-12-10
相关资源
最近更新 更多