javascript xml跨域乱 - 怎么回事?

时间:2013-10-03 15:41:31

标签: javascript jquery xml ajax cross-domain

我是js中的真正菜鸟。我已经看到了很多关于这方面的问题,但似乎没有一个问题让我明白。他们都落入了json,这是不可用的。 我正在尝试访问一个记录很差的API(它是葡萄牙语......)。它不支持Json和Jsonp。它只是xml,通过SOAP,HTTP GET和HTTP POST。我当然得到了:

  

XMLHttpRequest无法加载   http://www.camara.gov.br/SitCamaraWS/Deputados.asmx/ObterDeputados。   来源http://kubrusly.com不被允许   访问控制允许来源。

我的代码是:

$.ajax({
type: "GET",
url: "http://www.camara.gov.br/SitCamaraWS/Deputados.asmx/ObterDeputados",
dataType: "xml",
success: parseXml
});

在本地工作时这很好,但一旦上传到我的服务器,它将不会检索任何东西...... 好奇,如果我尝试dataType: "jsonp":P我得到一个错误抱怨意外的char'<'。并且在Safari的控制台中可以看到xml doc。因此,xml格式的数据到达浏览器,它就在那里,但我无法访问它......

因此,如果json不是一个选项,我该怎样才能检索这些数据?真是令人沮丧。

我在这里粘贴了测试代码:

http://jsfiddle.net/HwP2S/1/

@Kevin B. 感谢您的回答。我对CORS做了一些研究。我对此感到有些困惑。这应该发生在客户端吗?无论如何我从html5样板中获得了.htaccess,取消注释了

[编辑] - 解决了。

好的,所以我明白了,感谢你们的帮助。我会在这里注册我的解决方案...

我发现CORS的东西是在服务器端完成的,而不是我的情况。 我没有尝试YQL,你知道另外一个变量,语法......我让这个为最后一个,但不需要它。 我设法设置代理并完成它,我在设置用户代理之前花了很多时间,这样做了。在那之前我离开了403错误...

来自雅虎的

this页面帮助了我很多,一些很好的代码示例,包括js和PHP。

这里的代码对我有用:

JS:

    // Based on script from yahoo's example @ http://developer.yahoo.com/javascript/samples/ajax/sample_proxy_ajax.html
    // tweaked by vk

// end point without domain...
var endPtpath = '/SitCamaraWS/Deputados.asmx/ObterDeputados?';

//  PHP proxy
var proxiedUrl = 'http://kubrusly.com/yxd/php_proxy_simple.php?yws_path=' + encodeURIComponent(endPtpath);

// mind browsers... 
var xmlhttp = null;
if (window.XMLHttpRequest) {
  xmlhttp = new XMLHttpRequest();
        //overrideMimeType if supported
        if ( typeof xmlhttp.overrideMimeType != 'undefined') { xmlhttp.overrideMimeType('text/xml'); }
      } else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }  else {
        alert('Perhaps your browser does not support xmlhttprequests?');
      }

// Create an HTTP GET request
xmlhttp.open('GET', proxiedUrl, true);

// Set the callback function
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                // Output the results
                console.log(xmlhttp.responseText);
              } else {
                // waiting for the call to complete
            console.log("waiting...");
          }
        };

// Make the actual request
xmlhttp.send(null);

PHP

<?php
// PHP Proxy --- only 'GET'
// Based on script from yahoo's example @ http://developer.yahoo.com/javascript/samples/proxy/php_proxy_simple.txt
// tweaked by vk
//  hostname - just base domain
define ('HOSTNAME', 'http://www.camara.gov.br');

// Get the REST call path from the AJAX application - js;
$path = $_GET['yws_path'];

// assign yo url
$url = HOSTNAME.$path;

//Open the Curl session
$session = curl_init($url);

// Don't return HTTP headers. Do return the contents of the call
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_HTTPGET, true);

//set user agent, that did it!!! copied from browsers...
curl_setopt($session, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36');

// The web service returns XML. Set the Content-Type appropriately
header("Content-Type: text/xml");


//// verbose mode for debuging good tool!
// $fp_err = fopen('verbose_file.txt', 'ab+');
// fwrite($fp_err, date('Y-m-d H:i:s')."\n\n"); //add timestamp to theverbose log
// curl_setopt($session, CURLOPT_VERBOSE, 1);
// curl_setopt($session, CURLOPT_FAILONERROR, true);
// curl_setopt($session, CURLOPT_STDERR, $fp_err);


// Make the call
$xml = curl_exec($session);

// done, shutDown.
curl_close($session);
?>

0 个答案:

没有答案