跨域JSONP XML响应

时间:2014-06-24 03:15:51

标签: jquery ajax xml jsonp

我正在使用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但是它会产生一个错误,说“Unexpected token<”不幸的是,我停止处理,我没有收到警报消息。有什么想法吗?

最佳

1 个答案:

答案 0 :(得分:12)

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

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

    // 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语句以恢复您想要的内容。

    希望有所帮助