【问题标题】:Cross Domain JSONP XML Response跨域 JSONP XML 响应
【发布时间】:2014-08-14 04:40:08
【问题描述】:

我正在使用 JSONP 进行 api 跨域请求,外部服务器以 XML 格式返回结果,下面是我的代码:

$.ajax({
    type: "Get",
    url: "http://domain.com/function?Data=1234567890",
    xhrFields: {withCredentials: true},
    dataType: "JSONP text xml",
    contentType: "application/xml",
    cache: false,
    success: function(xml)
    {
    alert($(this).find('ResponseStatus').text());
    }
});

它返回给我一个 xml,但同时它会生成一个错误,说“意外的令牌

最好的

【问题讨论】:

  • 我真的希望这不是您的代码,并且复制和粘贴出现了严重错误......
  • 感谢佩里的指正...!!!!
  • 在我们查看您的代码之前,您必须解决更大的问题。作为一般规则,您不能使用 jsonp 解析 xml。这比我在stackoverflow.com/questions/10068963/… 的解释要好得多(请考虑给把它放在一起的作者+1)。尽管您会看到有潜在的解决方法,但是正如@jmort253 指出的那样,如果您对服务器的输出有足够的控制权,最好将其格式化为 JSON 以开始
  • 如果我在你的位置并且我无法对输出格式做任何事情,我可能会考虑在我的网络上粘贴几行 PHP 或 Python(或你选择的武器)服务器充当代理。

标签: jquery ajax xml jsonp


【解决方案1】:

如上面的 cmets 中所述,来自 javascript 的跨域 xml 是一个禁忌,除非您可以控制吐出 XML 的应用程序并且可以使用格式化技巧来“欺骗”脚本将其解析为 JSON . 如果你能做到这一点,那么问题就是为什么不首先格式化为 JSON? 所以...选项

  1. 格式化应用程序的输出以便使用 JSONP 进行处理。假设你不能在你的情况下这样做......
  2. 在您的网络服务器上使用本地代理。在 PHP、python 或任何其他没有跨域限制的语言中有很多简单的代理示例。就页面上的脚本而言,它是本地 AJAX 请求。如果你不能这样做,那么......
  3. 一种可能性是使用像 yql 这样的中介。 yql 和 jquery 可以解决很多这些 xml 问题。当然,缺点是您是通过您无法控制的第三方发送内容。

类似这样的:

// find some demo xml - DuckDuckGo is great for this
    var xmlSource = "http://api.duckduckgo.com/?q=StackOverflow&format=xml"

// build the yql query. Could be just a string - I think join makes easier reading
    var yqlURL = [
        "http://query.yahooapis.com/v1/public/yql",
        "?q=" + encodeURIComponent("select * from xml where url='" + xmlSource + "'"),
        "&format=xml&callback=?"
    ].join("");

// Now do the AJAX heavy lifting        
    $.getJSON(yqlURL, function(data){
        xmlContent = $(data.results[0]);
        var Abstract = $(xmlContent).find("Abstract").text();
        console.log(Abstract);
    });

当然,在该示例中,您将带回所有 xml 数据并在本地搜索它 - 可以选择调整 select 语句以带回您想要的内容。

希望有帮助

【讨论】:

  • 非常感谢佩里..你的第二个选项给了我黑客...我在我的一个页面上使用了本地 AJAX 请求,然后 PHP 和 CURL 救了我....
  • 鸭鸭go的api变了吗?该示例记录空字符串。不过使用 yql 似乎可行。
猜你喜欢
  • 2011-03-05
  • 2011-07-31
  • 2016-01-10
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
相关资源
最近更新 更多