У меня есть 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");
}
});
};
Что, конечно, не работает. Я совершенно новичок в веб-разработке, поэтому любая помощь будет принята с благодарностью.
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’, который по сути просто пересылает мои данные? Я открыт для предложений. Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я использовал 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>
И теперь я получаю ошибку Bad Request. Так где ошибка может быть?
Вы на правильном пути, ошибка, которую вы получаете, потому что ваш сервер WPF не имеет CORS Заголовки включены, заголовки CORS сообщают веб-браузерам, каким доменам разрешено подключаться к серверу, если текущий домен не разрешен, браузер отказывает в подключении.
Пример того, как включить CORS в WPF: http://enable-cors.org/server_wcf.html.
Других решений пока нет …