如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应

Posted

技术标签:

【中文标题】如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应【英文标题】:How to decode XML response from jQuery $.ajax request in Firefox 【发布时间】:2011-06-01 16:36:23 【问题描述】:

我正在尝试创建一个对 WebService 的 ajax 请求,该请求返回给定 XML 中某些指定参数的数据。这似乎在 IE 中运行良好,但 Firefox 无法解码响应。解码后我也可以在 Fiddler 中成功查看响应。代码如下:

$(function() 
    $.ajax(
        type: "GET",
        url: 'http:/localhost/webservice.asmx/GetTags?groupId=10',
        contentType: "text/xml; charset=utf-8",
        dataType: "xml",
        success: function(response) 
            $('#result').html('success',response);
            $(response).find("string").each(function() 
                $('#result').append($(this).text());
            );
        ,
        error: function(response) 
            $('#result').html('failure',response);
        
    );

);

有没有办法指定响应需要被解码?或者有什么其他方法可以让它工作?

编辑: @ Nikki9696 - 它不是 JSON 编码的,因为数据以 XML 形式返回。

@Oleg - 如果通过 URL 访问 web 服务,我可以在浏览器中看到的示例 XML 如下:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <string>tag 1</string>
  <string>tag 2</string>
  <string>tag 3</string>
</ArrayOfString>

TextView 中的提琴手返回 和一条消息

"响应已编码,可能需要 在检查前进行解码。点击 在这里转型。”

单击后,它会显示相同的 XML。我在 IIS 中关闭了动态内容压缩,然后 XML 在 fiddler 中立即可见,但 FF 仍然无法应对,因此排除了压缩。

我对脚本进行了一些尝试,似乎 jQuery 可以默认或猜测一些参数,因此 dataType 不是强制性的。通过这些设置,我收到一条成功消息,但它仍然不知道如何处理数据。我尝试按照某些 SS 线程中的建议将 dataType 设置为“jsonp”(目前找不到它,当我这样做时会链接它)并且错误更改为missing ; before statement,我猜是因为它不是 JSON 对象,而是 XML .有没有办法将 web 服务设置为返回 JSON?

编辑 2:我已更新 url 以反映实际发生的情况。对不起,我错过了它,让任何人都无法发现它。

【问题讨论】:

当你说“解码”时,你的意思是它是 JSON 编码的吗? 能否将您从网络服务接收到的以及您在 Fiddler 中看到的 xml 数据包含在内? 【参考方案1】:

因为您使用像 '/webservice.asmx/GetTags?groupId=10' 这样的相对 URL,所以使用不同的域没有问题。在我看来,你应该只修复一点你的 javascript 代码。比如下面的代码

$(function () 
    $.ajax(
        type: "GET",
        url: '/WebService1.asmx/GetTags',
        contentType: "text/xml; charset=utf-8",
        data: groupId:10,
        success: function (response) 
            $('#result').html('success:');
            $(response).find("string").each(function () 
                $('#result').append('<br />'+$(this).text());
            );
        ,
        error: function (response) 
            $('#result').html('failure:<br />' + response.responseText);
        
    );
);

在 Internet Explorer、Firefox 和 Google Chrome 中运行良好。如果您需要,我可以发布您可以下载整个 Visual Studio 2010 项目的 URL。

更新:要从 Web 方法返回 JSON 而不是 XML,您可以将 [ScriptMethod(UseHttpGet = true)] 替换为 [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 属性(在 .NET 4.0 中,您可以通过其他不同方式执行相同操作)和修改 JavaScript 代码如下

$(function () 
    $.ajax(
        type: "GET",
        url: '/WebService1.asmx/GetTagsJson',
        contentType: "application/json; charset=utf-8",
        data:  groupId: 10 ,
        //dataType: "xml",
        success: function (response) 
            $('#result').html('success:');
            $(response.d).each(function () 
                $('#result').append('<br />' + this);
            );
        ,
        error: function (response) 
            $('#result').html('failure:<br />' + response.responseText);
        
    );
);

【讨论】:

实际上路径不是相对的,这就是问题所在。我删掉了大部分内容以简化示例,因此任何人都无法发现。我会更改它以反映这一点。 @Shagglez:您的问题“/webservice.asmx/GetTags?groupId=10”中的 URL 路径是相对的。此外,您在代码中使用了错误的jQuery.html()(参见api.jquery.com/html):$('#result').html('success',response);。请参阅我的答案中的固定版本。【参考方案2】:

简短的回答是:我尝试从不同的域向我的网络服务发起呼叫。

这里有更多细节: 在 Firebug 中查看 XML 选项卡时,我注意到返回的错误是 XML Parsing Error: no element found Location: moz-nullprincipal:757cb587-20da-4d2f-bf80-e3b915a234d4 Line Number 1, Column 1:,因此我查找了这条特定消息,偶然发现有人遇到了同样的问题 http://forum.jquery.com/topic/jquery-ajax-and-xml-issues-no-element-found。这是解决我问题的部分:

虽然文档中没有明确说明,但您不能使用 AJAX 调用从其他域中获取数据。

我突然想到它在 IE 中工作的原因是它第一次问我是否允许进行这个不安全的调用(或类似的调用),它一定是指对一个 ajax 调用不同的域。 FF 从来没有提示过我,并且默认情况下可能禁用了呼叫。

使其跨域兼容是另一天的问题,现在它可以满足我的一切需求。

【讨论】:

以上是关于如何在 Firefox 中解码来自 jQuery $.ajax 请求的 XML 响应的主要内容,如果未能解决你的问题,请参考以下文章

Rails 无法正确解码来自 jQuery 的 JSON(数组变成带有整数键的散列)

JavaScript / jQuery:如何在 Firefox 中获取选定的文本

在 Firefox 中添加 JQuery datepicker 后如何隐藏 HTML 日历?

Firefox年内将默认启用AV1解码

如何在 Firefox 中屏蔽来自 WebRTC 的 IP 泄漏?

如何从 Codable 结构中捕获 init(来自解码器:解码器)中的错误?