【问题标题】:Get xml with HTTPRequest in a page without an xml file extension在没有 xml 文件扩展名的页面中使用 HTTPRequest 获取 xml
【发布时间】:2011-09-17 10:07:10
【问题描述】:

我正在尝试使用使用 jquerys ajax 函数的 HTTPRequest 从页面获取 xml。该函数不返回任何内容。我为什么这不起作用的理论是因为我点击的页面具有文件扩展名“.ns”而不是“.xml”这是我点击的页面的完整页面源。

   <?xml version="1.0" encoding="UTF-8"?>
<logged_in_reps>
</logged_in_reps>

如何从 HTTPRequest 中获取此 XML?

一些可能有帮助的附加信息:当我保存网页时,它保存为“command.ns.xml”(网址只有 .ns 而不是 .xml)以及当我在同一目录中点击此页面时作为我自己的具有请求的文件(扩展名为 .xml),它工作正常。

另外,发出请求的文件所在的域是“www.csun.edu”,而我要访问的页面是“remotesupport.csun.edu”。这会是个问题吗?

这是拨打电话的代码(不幸的是,我无法提供用户名和密码以及我点击的网址)

$.ajax({
    url: 'https://remotesupport.csun.edu/api/command.ns?username=user&password=pass&action=get_logged_in_reps',
    type: 'GET',
    datatype: 'xml',
    success: function(xml) {
        alert(xml);
    }
});

【问题讨论】:

  • 您是否尝试过使用 Firebug 检查在浏览器中访问该 URL 时发出的请求?可能有重定向或其他东西。另外,您是否尝试以数据类型“文本”下载以查看会发生什么?
  • 是的,我使用 firebug 检查响应并请求没有重定向。在萤火虫中,它表示 XML“XML 解析错误:找不到元素位置:moz-nullprincipal:{23e8ddc5-bc72-4c7e-8e5f-79e181071896} 第 1 行,第 1 列:”

标签: jquery xml httprequest


【解决方案1】:

有两个主要问题。

首先,由于Same Origin Policy,您被拒绝访问该 XML 文件。

其次,dataType 参数必须用作确切的字符串。

【讨论】:

    【解决方案2】:

    是的,问题在于名为Same Origin Policy 的安全限制。

    您可以使用 JSONP 技术绕过它(请参阅 JQuery 支持解释 here),但这需要您包装生成的 XML 输出。

    另一种解决方案是通过源服务器(在您的情况下为 www.csun.edu)代理您的 Ajax 请求。

    【讨论】:

    • 如果 firebug 在我点击的页面上显示语法错误,这是否意味着 JSONP 不受支持?这是我正在使用的代码 $.ajax({ dataType: 'jsonp', url: "remotesupport.csun.edu/api/…", success: function (res) { alert(res); }, });
    • 请注意(如上所述),API 响应需要调整为 JSONP。发布的 Jquery 链接简要解释了响应的外观(它被解释为 JavaScript!)。 This SO question 提供了通过 JSONP 传递 XML 的讨论。
    【解决方案3】:

    要解决同源策略问题,以及要从中获取 XML 的服务器不支持 JSONP 的事实,您可以使用 YQL。

    Here's an example

    然后,您可以将其用作 JSONP 请求的 URL:

    http://query.yahooapis.com/v1/public/yql?q=select * from xml where url="http://the-xml-url.com"

    所以对于你的问题,你会做这样的事情:

    yql_url = function(source_url) {
      return "http://query.yahooapis.com/v1/public/yql?q=select * from xml where url=\"" + source_url + "\"";
    };
    
    $.ajax({
        url: yql_url('https://remotesupport.csun.edu/api/command.ns?username=user&password=pass&action=get_logged_in_reps'),
        type: 'GET',
        dataType: 'xml',
        success: function(xml) {
            console.log($(xml).find('result'));
        }
    });
    

    【讨论】:

    • 什么意思?你想做什么用这个方法做不到的?
    • 我在一所学校工作。在我使用这种方法后,他们告诉我,我们可以将任何东西放到生产中,将数据发送到我们无法控制的东西
    • 除非你能得到 csun.edu 的 API 来支持 JSONP,否则你别无选择,只能使用代理。许多人使用 YQL 是因为它快速可靠。如果不允许您使用他们的服务,那么唯一的其他选择就是托管您自己的代理。
    • 代理很容易实现。您需要做的就是处理每个请求的 2 个参数。 url 和回调。然后,您从 url 下载数据,并将其作为字符串插入到以回调参数命名的 javascript 函数中。例如。 callbackname("&lt;thexmldata&gt;&lt;/thexmldata&gt;")。然后,您只需将其作为响应返回。
    • 是的,设置代理将是最后的手段,因为我自己无法设置,所以我必须让有更多访问权限的人来做。感谢您对橡子的帮助。我很感激。
    猜你喜欢
    • 2012-01-07
    • 2019-05-21
    • 2018-12-09
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多