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