我是一个真正的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 不是一个选项,我该如何检索这些数据?这太令人沮丧了。
我在这里粘贴了测试代码:
@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);
?>