【问题标题】:Extract external domain xml data with jquery使用 jquery 提取外部域 xml 数据
【发布时间】:2018-04-16 07:36:12
【问题描述】:

通过 jquery ajax 从外部域中提取 xml 数据时,浏览器出现错误。

我尝试这样做:

$.ajax({
    type: "GET" ,
     url: "http://api.radionomy.com/currentsong.cfm?radiouid=E8FBFBE1-E50F-4E6A-BEA7-CA2E41F96D0B&apikey=cf41bd17-7638-4c10-b869-341555a65d7f&type=xml&previous=yes&next=yes&cover=yes&callmeback=yes&defaultcover=yes" ,
dataType: "xml" ,   
 success: function(xml) {


    var title = $(xml).find('title').text(),  
    artist = $(xml).find('artists').text(); 



Actc(title, artist);


    }

});

我在每 20 秒更新一次数据的 setinterval 内收到该 ajax 请求。

一会还好,后来浏览器(Chrome)报这个错误,停止读取xml信息:

无法加载 http://api.radionomy.com/currentsong.cfm?radiouid=XXXXXXXX&apikey=xxxxxxx&callmeback=yes&type=xml&cover=yes&previous=yes:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost.canal' 不允许访问。响应的 HTTP 状态代码为 403。

我已经搜索了信息,但我无法弄清楚。除非在我的服务器上启用了 CORS,否则似乎无法使用 ajax 从不同的域中提取 xml 内容。

https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS

虽然我尝试将其添加到 .htaccess 中但没有成功,因为我一直在报错。我也试过用 php 来做,但也没有成功。我肯定做错了什么,我在这方面不是很专家。

htaccess:

<IfModule mod_rewrite.c>
  Header add Access-Control-Allow-Origin: "*"
  Header add Access-Control-Allow-Methods: "GET, POST, PATCH, PUT, DELETE, OPTIONS"
  Header add Access-Control-Allow-Headers: "Origin, Content-Type, X-Auth-Token"
  Header add Content-Type: "application/json"
</IfModule>

如何在没有CORS问题的情况下提取 XML 数据?

【问题讨论】:

  • 否...除非在您尝试从中获取数据的服务器上启用了 CORS
  • 我认为 Radionomy 没有启用它。他们在这里说:board.radionomy.com/viewtopic.php?f=35&t=26734我已经尝试过这个解决方案,它给出了同样的错误。还有其他方法可以提取这些数据吗?
  • 那个线程的 OP 和你有同样的问题。并构建了一个工具来解决它
  • 您可以简单地在您的服务器上发出请求,然后将 xml 发送到您的客户端

标签: javascript jquery ajax xml cors


【解决方案1】:

关于 CORS,它指的是远程服务器,而不是您自己的。所以 Radionomy 需要在他们的服务器上启用它。

但是您提到它可以正常工作一段时间,这意味着他们正确设置了它(那些时间)。

因此,除非这是他们一方的问题,否则可能是在他们的 api 文档中,请求返回的 callmeback 值指定了下一个查询应该发生的时间。但是您已将其硬编码为 20 秒。也许他们阻止了您,因为您尝试得太早并且他们认为这是滥用。


另一种绕过 CORS 的方法是让您的 ajax 调用调用您服务器上的一个页面,该页面将用于对 API 进行远程调用。这是因为 CORS 仅在从浏览器进行调用时才有效。

【讨论】:

  • 我没想到,什么时候才是正确的?你能把api文档的网址传给我吗?
  • @PlayerWet 当您发出请求时,返回的 xml 包含一个名为 callmeback 的节点,它包含一个以毫秒为单位的整数,我假设它说明您应该何时发出下一个请求。因此,您应该使用超时而不是间隔,每次都在返回的 xml 中指定延迟。
  • 谢谢。就是这样,时间太短了。
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2018-10-21
  • 2012-07-08
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多