使用javascript请求远程XML数据

时间:2012-11-07 00:27:56

标签: javascript jquery xml same-origin-policy

好的,这是我的问题。我正在研究这个名为10winstreak的小站点,我正在尝试使用javascript检测流是否存在,因为我们运行该站点的服务器无法使用PHP处理每个请求。检测流是否存在的基础是你去他们的XML文件和他们的一个标签(如果它是实时的)它会说出一些真实的东西,通常是他们网站上的XML文件将是空的如果某个特定的流不是活的。例如,如果你有一个针对gamespot的twitch.tv流,你可以转到http://api.justin.tv/api/stream/list.xml?channel=gamespot,如果它有内容,那么如果没有,那么它就是现场直播。

基本上我的代码看起来像这样:

    function check (URL, term){
    $.get(URL , function(data){
        console.log(data);
        //data is whatever the server returns from the request, do whatever is needed with it to show who is live.

        var number = data.search(term);
        if (number > -1)            
        {
            document.write("Live");
        }

        else 
        {   
            document.write("Offline");
        }
    });
    }

和URL是传入的URL,term是要在xml文件中搜索的术语(通常为“true”或“True”)。但在发生任何事情之前,我最终得出的结果是“XMLHttpRequest无法加载http://api.own3d.tv/liveCheck.php?live_id=6815。Access-Control-Allow-Origin不允许使用Origin(我的服务器的URL)。”

我在网上看了一遍,我似乎无法找到任何可以使用的东西。有很多理论的东西,但没有足够的实际代码,我不理解理论的东西,能够开始输入代码。从我所见,你有两种方法,使用JSONP或在服务器的某处添加一行,以允许跨域访问。我既不完全理解,也不知道怎么做或做什么。如果有人向我展示需要做些什么来摆脱这个错误,那将会有很多帮助。当然,如果你可以向像我这样的非编码器解释它会更加真棒但是在我目前的观点,只要代码适用于所有我关心它也可能是魔术大声笑。

4 个答案:

答案 0 :(得分:1)

你可以解决它:)

查看xReader

<script src="http://kincrew.github.com/xReader/xReader.full.js"></script> 
<script type="text/javascript"> 
xReader("http://api.own3d.tv/liveCheck.php?live_id=6815", function(data) { 
    alert(data.content); 
})
</script>

我认为你需要cacheburst选项。但你可以被禁止使用YQL。

答案 1 :(得分:0)

简短回答:除非10winstreak提供JSONP服务,否则您必须在服务器端执行操作。

答案稍长:

出于安全考虑,浏览器不允许您从www.example.com向www.example2.com(或除www.example.com以外的任何其他域)发出AJAX请求。除了使用JSONP之外,您无法做很多事情(如果远程Web服务提供它,您只能这样做。)

因此,您最终需要做的是询问您的服务器&#34;嘿其他服务器上的内容是什么?&#34;并且(因为它不限制浏览器的方式)它可以从其他服务器获取XML。使用代码或Apache配置有多种方法可以做到这一点;不确定什么适合你,但希望你现在明白一般原则。

P.S。如果您对为什么浏览器这样做感到好奇,请参阅此问题:Wouldn't have been simpler to just discard cookies for cross-domain XHR?

*编辑*

我刚刚查看了JustinTV的网站,看来他们已经有了一个PHP库供您使用: https://github.com/jtvapi/jtv_php_api

这很可能是你最好的选择(如果你想继续使用PHP;如果不是,他们有其他语言的库:http://www.justin.tv/p/api)。

答案 2 :(得分:0)

我认为这是因为路径不是相对的。您可能是从不同的域/子域调用此。您可能允许其他来源访问,这可能会打开安全漏洞,或者您可以在本地创建代理。

在PHP中创建代理很容易:http://blog.proxybonanza.com/programming/php-curl-with-proxy/ 现在,不是将您的请求直接发送到该URL,而是将请求从jQuery发送到您自己的本地URL,并让它在服务器端访问它。

另一种选择是使用YQL:http://www.parrisstudios.com/?p=333(我之前写过一篇关于此的文章)...以这种方式,您可以将响应转换为JSON,可以跨域访问(如可以javascript)。

您可以要求使用JSONP服务器和JSON返回所有API响应。

答案 3 :(得分:0)

您无法通过客户端javascript执行此操作,除非他们已启用一些方式来检索跨域数据(CORS,{{3一些flash小工具从他们服务器上的JSONP文件中获取读取权限...)