Javascript跨域Web服务调用

时间:2011-12-13 00:31:51

标签: javascript ajax jquery

我正在尝试从javascript调用返回XML文档的.NET Web服务。 Web服务位于与我的应用程序不同的Web服务器上。我无法控制Web服务。我已经使用jQuery成功调用了服务,将dataType设置为jsonp,我可以看到在Firebug中返回XML文档。但是,我在Firebug控制台中出现错误“missing; before statement”,看起来它正在尝试解析返回的xml(可能是json)。任何想法或什么是调用返回xml的跨域Web服务的最佳方式?非常感谢!

4 个答案:

答案 0 :(得分:1)

JSON-P数据格式是一个JavaScript程序。如果您使用JSON-P,那么您获得的数据必须是JavaScript。

JSON-P的工作原理是使用<script>元素加载文档(这对于任意XML数据永远不会起作用)

您的选择是:

  1. 说服谁控制Web服务以提供JSON-P接口
  2. 说服控制网络服务的任何人通过CORS授予您网站访问权限(注意limited browser support
  3. 通过您自己的服务器代理Web服务,以便您的JS在same origin
  4. 上运行

答案 1 :(得分:0)

这样的事情:

$.getJSON("http://yoursite.com/xml2json.php?callback=?",
  {feed:"http://agency.nd.edu/agencynd-team.xml"},
    function(data) {
      // process data here
    }
});

<?php
header('content-type: application/json; charset=utf-8');

if( strlen($_GET["feed"]) > 13 ) {
  $xml = file_get_contents(urldecode($_GET["feed"]));
  if($xml) {
    $data = @simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($data);

    echo isset($_GET["callback"]) ? "{$_GET[’callback’]}($json)" : $json;
  }
}
?>

答案 2 :(得分:0)

如果将dataType设置为jsonp,则应该在函数调用中包含响应。例如,如果你希望得到

object {"key": "value"} 

jsonp的响应应为

parseRespone({"key":"value"});

原因是jsonp添加&lt; script&gt;标记到您的页眉,所以它应该附加有效的JavaScript代码。

如果您无法与服务器的开发人员联系,我建议对您的页面进行ajax调用,其中页面将与.NET服务器进行curl连接并在纯json中恢复响应。

答案 3 :(得分:0)

一种可能性是完全避免使用JSON并使用cURL和PHP代理。将数据发送到服务器上的PHP脚本,然后与另一个域上的脚本形成一个cURL会话,并将结果返回给原始的AJAX调用者。