使用jsonp获取xml跨域

Posted

技术标签:

【中文标题】使用jsonp获取xml跨域【英文标题】:use jsonp to get xml cross domain 【发布时间】:2011-03-05 08:27:00 【问题描述】:

我正在尝试从另一台服务器将 xml 读入网页,我认为我的问题是同源策略,因此是跨域问题。

我用谷歌搜索了一下,似乎 jsonp 是前进的方向。 根据我在 *** 和其他站点上找到的一些示例,这就是我所拥有的,它不会使用 xml 来“命中”服务器。我可以在浏览器中查看 xml。

$(document).ready(function()    
   $.ajax(
        type: 'GET',
        dataType: 'jsonp',                
        url: 'http://192.168.0.106:8111/getconfiguration?',
        success: function (xml) 
         //do stuff with received xml 
        );    

有什么建议吗?请记住,我是 JS / JQuery 的新手;o)

【问题讨论】:

【参考方案1】:

如果您无权访问服务器(例如,您正在使用 api),您可以使用 YQL 将您的 XML 转换为 jsonp 并使用自定义自定义 YQL url(其中嵌入了类似 SQL 的语句)从浏览器查询雅虎服务器。这是一个示例(对于 zillow api):

$('document').ready(function()
  $.ajax(
    url: 'http://query.yahooapis.com/v1/public/yql?q=select * from zillow.search where address = "1835 73rd Ave NE" and citystatezip = "98039" and zwsid = "X1-ZWz1cse68iatcb_13bwv"&format=json&diagnostics=true&env=http://datatables.org/alltables.env&callback=mydata',
    jsonpCallback: "mydata",
    success: function(results) 
      console.log(results.query.results.searchresults.response.results.result.zpid);
    ,
    dataType: 'jsonp'
  );
);

【讨论】:

【参考方案2】:

如果您可以访问在远程服务器上生成 XML 的代码,则可以将整个内容包装在 jsonp 中。

JSONP 是一种绕过同源策略的方法,通过使用<script> 标签获取数据,而不是尝试远程提取信息。

在你的 getconfiguation 脚本中,你会有类似的东西

callback("SERVER GENERATED XML/JSON DATA GOES HERE");

远程调用指定回调的地方

例如,如果你的远程脚本是 php,你可以让它看起来像这样:

<?php
// getconfiguration.php
echo "$_GET['callback']($configuration_data);"
?>

然后运行您在问题中提供的 AJAX。 这实际上是在您的页面中动态插入一个脚本标签,如下所示:

<script src="http://192.168.0.106:8111/getconfiguation.php?callback=???"></script>

jquery 填写 ???为您提供一些为您的成功回调生成的独特包装器

【讨论】:

如果您无法访问它怎么办?您只能发送/接收 xml 格式的数据。 如果服务器没有设置为处理跨域、客户端、javascript交互,那么你不能强制它。在您的服务器、flash 或 java 小程序上使用代理有多种解决方法。

以上是关于使用jsonp获取xml跨域的主要内容,如果未能解决你的问题,请参考以下文章

使用图片跨域方式获取图片数据 使用 jsonp 方式跨域获取数据

通用jsonp跨域技术获取天气数据

JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)

AJAX 跨域请求 - JSONP获取JSON数据

原生JS简单封装JSONP跨域获取数据

AJAX 跨域请求 - JSONP获取JSON数据