【问题标题】:Cross site call in ajax: responseXML undefinedajax 中的跨站点调用:responseXML 未定义
【发布时间】:2012-10-25 19:27:28
【问题描述】:

我正在开发一个脚本,该脚本执行对 python web 服务的跨站点调用,它返回一个 xml。 这是执行跨站调用的html页面的完整代码:

<html>
<head>

  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
  <script src="./jquery.xdomainajax.js"></script>

  <script>        
jQuery.ajax({
  type: "GET",
  url: "http://api.notmywebsite.net/search/parameters",
  async: true,
  beforeSend: function(xhr) {
    xhr.withCredentials = true;
      },
  success: function(data) {
    alert(data.responseXML);
  },
  error: function(err){
    alert("error: " + err.status);
  }
});
  </script>

</head>

<body>
  <div id="xmlOutput"></div>
</body>
</html>

当然,问题是脚本不起作用: - 当我通过浏览器调用webservice时,xml成功显示。 - 我正在使用 WebScarab 来检查答案是否有任何内容,并且它有。 HTTP 响应具有正确的标头和预期的 XML 响应。 - 我调试了 python 网络服务以检查我的请求进行的调用是否会返回预期的 XML,并且确实如此。

经过一些研究,我发现了同源策略,为此我开始使用(希望我使用正确)以下代理:https://github.com/padolsey/jQuery-Plugins/blob/master/cross-domain-ajax/jquery.xdomainajax.js

webservice 也使用 php 调用,通过“simplexml_load_file($url);”返回预期的 XML 响应。

我尝试对 google 执行同样的调用(但使用 responseText 而不是 responseXML),它成功了。

xml格式如下:

<OAI-PMH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/OAI-PMH http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
  <record>
    <header>
      <identifier>oai:epimarketplace.net:empid:1066</identifier>
      <datestamp>2012-06-25T14:54:01.058Z</datestamp>
      <setSpec>resource</setSpec>
      <downLink>http://api.epimarketplace.net/fetch/pid/empid:1066</downLink>
    </header>
    <metadata>
      <em>
        <metadataLink>http://api.epimarketplace.net/rawfetch/pid/empid:1066/datastream/EM</metadataLink>
        <field name="PID">empid:1066</field>
        <field name="em.dateSubmitted">2012-08-20T10:43:40Z</field>
        <field name="em.generalDescription.subject">Behaviour</field>
        <field name="em.generalDescription.type">Dataset harvested from social networks</field>
        <field name="em.title">&#60&#115&#99&#114&#105&#112&#116&#62&#88&#83&#83&#60&#47&#115&#99&#114&#105&#112&#116&#62&#10</field>
        <field name="em.uploader.name">Tiago André Posse</field>
        <field name="isCollection_b">false</field>
        <field name="nComments">0</field>
        <field name="nLikes">0</field>
      </em>
    </metadata>
  </record>
</OAI-PMH>

希望你能帮助我,

提前致谢。

【问题讨论】:

  • responseXML 一直给我带来困难。我通常使用 responseText 代替,然后将文本字符串解析为 XML DOM 对象。 无论如何,我已经发布了某些可能会出错的点。
  • 你对自己的问题不再感兴趣了吗?即使您有自己的解决方案,也请发布........

标签: ajax csrf


【解决方案1】:

为了让浏览器使用 responseXML 正确返回 XML 对象,您必须确保以下几点:

1.您的 XML 文档格式正确(如果不是,responseXML 将始终返回 null

2.在 Firefox 中,在您的 Ajax 请求开始时调用 request.overrideMimeType('text/xml')(在实例化时) ) 明确告诉浏览器返回的数据将具有“text/xml”的内容类型。

3.IE 不支持客户端 overrideMimeType() 方法,因此您必须确保您的服务器为正在生成的 XML 文件返回正确的“text/xml”内容头类型回来。

注意:如果您的 XML 文件以“.xml”的扩展名命名,大多数服务器默认发送正确的“text/xml”标头,但如果不是,您'我想修改你的服务器设置来做到这一点。有关详细信息,请参阅“XML 文档和 IE 中的内容类型陷阱”。

如果不满足以上任一条件,则返回的数据将是纯文本,而不是预期的 XML 对象。

编辑:我查看了您的 JQuery Ajax 调用(再次),您猜怎么着?! responseXML 将始终未定义,因为您甚至在 AJAX 请求完成之前就尝试访问它。我的解决方案是调用 complete 属性下的函数,而不是 success

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2011-10-29
    • 2021-06-10
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多