【问题标题】:Using JSONP to get XML使用 JSONP 获取 XML
【发布时间】:2012-02-29 00:25:10
【问题描述】:

这两天,我浏览了很多论坛站点,但我没有找到解决问题的确切方法。 我有跨站点脚本问题。我使用 javascript、html 和 css 编写的应用程序的 Web 服务出现类似错误;

“XMLHttpRequest 无法加载...bla bla bla..Origin http://localhost:8088 不允许 Access-Control-Allow-Origin 响应标头。” 我写的代码是;

$.ajax({

async: false,
type: "GET",
url: "http://www.yem...om/Cata.../M...ogin2?username=blabla&password=blabla123",
dataType: "xml",
success: function(xml) {
    alert("CONTROL???");
    $(xml).find('Login').each(function(){
        var logResult = $(this).find('Result').text();
        alert(logResult);
        });


    }
  })

;

我知道我必须使用 JSONP。但是当我写 dataType:"*jsonp xml*" 或 dataType:"*jsonp text xml*" 时,我收到一个错误消息,例如“SyntaxError: Parse Error”!

另外,我尝试了 CORS 过滤器,但它需要 web.xml 但我没有。当我创建并尝试使用它时,我失败了!

此外,我尝试了 James Padolsey http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/ 使用 jQuery 的跨域请求 它有效,但我没有解析收到的数据。该插件使用Yahoo Query Language,因此控制数据不同且不易。

还有什么办法可以解决我的问题吗?请帮帮我!

最好的祝愿。

【问题讨论】:

    标签: javascript xml xmlhttprequest cross-domain jsonp


    【解决方案1】:

    存在跨域限制是有原因的。它保护互联网用户。它可以防止程序员和黑客做很多有害的事情。

    您可以采取一些措施来绕过它。其中之一是您可以执行 CORS 过滤器以允许来自跨域的请求。你说你没有 web.xml 文件。我不确定您的项目是什么样的,但如果您使用的是 Web 服务,那么在某处应该有某种 web.xml 文件。如果你不能设置它,那么你就不走运了(没有使用像 YQL 这样的好代理或类似的东西)。像 YQL 这样的东西,他们已经将 CORS 过滤器设置为允许来自所有域的请求。调用 YQL 是一个 ajax 调用,就像您尝试执行的 ajax 调用一样。最大的不同是 YQL 服务器具有 CORS 过滤器设置,浏览器检测并允许跨域请求继续进行。

    一旦设置了 CORS 过滤器,浏览器将允许您从其他域访问该域。您需要设置项目以允许跨源请求,而不是寻找破解方法。

    如果您不控制您尝试 ping 的 Web 服务,那么您就不走运了。只有 web 服务的所有者才能访问 web.xml。

    【讨论】:

    • 我的应用程序是一种智能电视应用程序。我使用 Eclipse Enterprise Edition 作为编辑器,使用 Apache Tomcat 7.0 作为服务器。在我的应用程序中,没有 web.xml 文件,但 Tomcat 有一个。但是,这个应用程序将在不同的电视上使用,如果我们认为该应用程序是客户端而电视系统是服务器,我没有机会控制所有电视。因此,我必须在客户端(我的应用程序)上做一些事情,而不是在 Apache Tomcat 端做一些改变。
    • 此外,我收到了一些基于 YQL 的 James Padolsey 插件的数据,但是来自 web 服务的数据与预期的数据(xml)不同,所以我不知道如何解析它。 alert("CONTROL???") 已处理但 $(xml).find('Login').each(function(){...} 未处理!
    • @séan35,在您的示例中,您正在尝试将 ajax 发送到“yem...om/Cata.../…”。你拥有那个域名吗?或者谁拥有该域?不管是谁,他们都需要编辑他们的网络服务器以允许跨域请求。一旦他们这样做了,您的 GoogleTV 应用程序(我猜它是从浏览器运行的)应该可以工作了。
    【解决方案2】:

    要以 JSONP 格式获取结果,请将其附加到 URL 的末尾:&callback=?

    试试这个:

    $.getJSON('http://www.yem...om/Cata.../M...ogin2?username=blabla&password=blabla123&callback=?', function(xml) {
        alert("CONTROL???");
        $(xml).find('Login').each(function(){
            var logResult = $(this).find('Result').text();
            alert(logResult);
        });
    });
    

    服务器端也必须启用跨域脚本。

    【讨论】:

    • “SyntaxError: Parse Error”又来了!另外,我不确定 getJSON 命令是否用于 XML。
    【解决方案3】:

    我也遇到了类似的问题。我发现这个问题的解决方案解决了我的 XSS 问题: 'No Transport' Error w/ jQuery ajax call in IE

    您不必使用 JSONP,因为 CORS 可以处理 XML 响应。您是否尝试将 support.cors 属性设置为 true(上述问题中的解决方案)?

    $.support.cors = true;

    【讨论】:

    • 很抱歉,我没有机会验证您的解决方案。我不再开发包含问题中问题的项目。我什至没有安装平台来尝试这个:) 但是,谢谢你的贡献。
    【解决方案4】:

    您可以在/* comment */ 内部的Javascript 函数中编写XML,并使用functionname.toString() 方法将此函数转换为文本并解析“/*”和“*/”之间的文本使用 JSONPcallback 函数,适用于所有旧浏览器。示例 xml_via_jsonp.js

    function myfunc()
    {/*
    <xml>
    <div class="container">
            <div class="panel panel-info col-lg-10 col-lg-offset-1 added-panel">
                <div class="panel-heading">Random1 - Random2</div>
                <div class="panel-body">
                    <div>Random3</div>
                </div>
            </div>
        </div>
    </xml>
    */}
    
    function callback(func)
    {
    var myhtml = func.toString();
    var htmlstart = myhtml.indexOf('/*');
    var htmlend = myhtml.lastIndexOf('*/');
    return myhtml.substr(htmlstart+2, htmlend-htmlstart-2);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 2013-12-28
      • 2016-02-15
      • 2012-08-18
      • 1970-01-01
      • 2013-08-16
      • 2011-03-27
      • 2012-12-24
      • 2019-07-18
      相关资源
      最近更新 更多