У меня есть API WCF, с которым я должен подключиться. У меня нет доступа к его коду, но это работает:
$user = "login";
$password = "pwdstr";
$service_credentials = "external_api_user:sometext";
$arg = $user.'|'.sha1($user."somestr".$password);
$url='https://mysteryUrl.svc/projectsapi/' . $arg;
// Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_USERAGENT => 'Codular Sample cURL Request',
CURLOPT_HTTPHEADER => array("Authorization: " . base64_encode("Basic " + service_credentials))));
// Send the request & save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);
echo $resp;
И я хотел бы, чтобы моя веб-страница получала данные от одного и того же api. Пока мне это удалось:
function requestFromApi() {
var user = "login";
var password = "pwdstr";
var service_credentials = "external_api_user:sometext";
var arg = user + '|' + sha1(user + "somestr" + password);
var url = 'https://mysteryUrl.svc/projectsapi/' + arg;
$.ajax({
url: url,
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", base64_encode("Basic " + service_credentials));
xhr.setRequestHeader("User-Agent",'Codular Sample cURL Request');
},
type: 'GET',
dataType: 'json',
contentType: 'application/json',
success: function (data) {
alert(JSON.stringify(data));
},
error: function(){
alert("Cannot get data");
}
});
};
Что, конечно, не работает. Im совершенно новый для веб-разработки, поэтому любая помощь будет принята с благодарностью.
Консоль Chrome выдает это при загрузке страницы:
Refused to set unsafe header "User-Agent"
XMLHttpRequest cannot load http s://verylongUrlAsInTheCodeAbove. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 400.
Как настроить заголовок? Мне кажется, что хотя бы одна из проблем пытается получить доступ к другому домену, так как я могу это сделать?
Есть ли другой способ получить доступ к этому API с помощью JavaScript? Может ли сделать немой PHP-API, который в основном просто повторит мою работу с данными? Я открыт для предложений. Заранее спасибо!
EDIT: Я использовал JSONP:
<head>
<script type="text/javascript" src="js/jquery-2.1.1.js"></script>
<script type="text/javascript" src="js/jquery.mobile-1.4.5/jquery.mobile-1.4.5.js"></script>
<script type="text/javascript" src="js/functions.js"></script>
<script>
alert('1');
$(document).ready(function requestFromApi() {
var user = "login";
var password = "pwdstr";
var service_credentials = "external_api_user:sometext";
var arg = user + '|' + sha1(user + "somestr" + password);
var url='https://mysteryUrl.svc/projectsapi/' + arg;
$.ajax({
url: url+"?callback=?",
beforeSend: function(xhr) {
xhr.setRequestHeader("Authorization", base64_encode("Basic " + service_credentials) );
xhr.setRequestHeader("User-Agent",'Codular Sample cURL Request');
},
type: 'GET',
dataType: 'json',
contentType: 'application/json',
success: function (dataWeGotViaJsonp) {
alert(dataWeGotViaJsonp);
},
error: function(){
alert("Cannot get data");
}
});
});
alert('2');
</script>
</head>
И теперь я получаю ошибку с неправильным запросом. Так где же ошибка?
Вы находитесь на хорошем пути, ошибка, которую вы получаете, заключается в том, что на вашем WPF-сервере нет заголовков CORS, заголовки CORS указывают веб-браузерам, домены которых разрешены для подключения к серверу, если текущий домен не разрешен браузером отказывается от соединения.
Пример того, как включить CORS в WPF: http://enable-cors.org/server_wcf.html.