0

我是一个真正的js菜鸟。我已经看到了很多关于此的问题,但似乎没有一个对我来说很清楚。它们都属于 json,这是不可用的。我正在尝试访问一个文档记录很差的API(它是葡萄牙语......)。它不支持 Json 也不支持 Jsonp。它只是 xml,通过 SOAP、HTTP GET e HTTP POST。当然,我得到:

XMLHttpRequest 无法加载 http://www.camara.gov.br/SitCamaraWS/Deputados.asmx/ObterDeputados。Access-Control-Allow-Origin 不允许来源http://kubrusly.com 。

我的代码是:

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

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

因此,如果 json 不是一个选项,我该如何检索这些数据?这太令人沮丧了。

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

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

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

[编辑] - 解决了。

好的,我开始了,谢谢大家的帮助。我会让我的解决方案在这里注册...

我发现 CORS 的东西是在服务器端完成的,而不是我的情况。我没有尝试 YQL,你知道还有一个变量,语法......我把它放在最后,但不需要它。我设法设置了一个代理并通过它,我在设置用户代理之前花了很多时间,并且做到了。在此之前我得到了 403 错误...

来自 yahoo 的这个页面,对我有很大帮助,一些很好的代码示例,包括 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);
?>
4

0 回答 0