JavaScript API биллинга JavaScript возвращает ошибку CORS, но не при использовании почтальона
Я в растерянности сейчас. Я пытаюсь получить доступ к API Azure Billing & Usage через приложение php, но получаю следующую ошибку:
XMLHttpRequest не может загрузить https://ea.azure.com/rest/ {соглашение number}/ отчеты об использовании. Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Поэтому происхождение ' http://localhost/ ' не разрешено.
Я знаю, что по ссылке упоминается URL-адрес https://consumption.azure.com/v2/enrollments, однако это не помогло мне, и после обращения в службу технической поддержки Azure мне пришлось использовать более старую точку входа ea.azure.com.
Я пытаюсь сделать это на своем локальном сервере разработки xampp, а также на производственном сервере (решение для внутренней сети), но безрезультатно. С помощью почтальона соединение успешно установлено, и я получил правильный ответ от API.
В основном API требует только ключ API, который у меня есть. авторизация не требуется рядом с этим.
Поскольку Почтальон успешно получил правильный ответ от API, я использовал их генератор кода, чтобы получить меня:
- скрипт php
- сценарий JavaScript
- JQuery AJAX скрипт
Все они возвращают одну и ту же ошибку для меня; JQuery AJAX один показано, потому что это предпочтительнее:
var settings = {
"async": true,
"crossDomain": true,
"url": "https://ea.azure.com/rest/<?php echo $agreement_number; ?>/usage-reports",
"method": "GET",
"dataType": 'json',
"headers": {
"authorization": "bearer <?php echo $key; ?>"
},
error: function (jqXHR, exception) {
var msg = '';
if (jqXHR.status === 0) {
msg = 'Not connected.\n Verify Network.';
} else if (jqXHR.status == 404) {
msg = 'Requested page not found. [404]';
} else if (jqXHR.status == 500) {
msg = 'Internal Server Error [500].';
} else if (exception === 'parsererror') {
msg = 'Requested JSON parse failed.';
} else if (exception === 'timeout') {
msg = 'Time out error.';
} else if (exception === 'abort') {
msg = 'Ajax request aborted.';
} else {
msg = 'Uncaught Error.\n' + jqXHR.responseText;
}
console.log(msg);
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
Я не понимаю, почему Postman может подключаться к API и получать его информацию, в то время как точно такой же код генерирует ошибку CORS при использовании в моем приложении.
Может ли это быть как-то связано с размещением моего приложения на внутренней виртуальной машине в сети компании, недоступной из Интернета?
Изменить: Рори упомянул жесткие ограничения безопасности JS - поэтому я также добавил сценарий php. Поскольку я использую php 5.6, у меня нет класса httpRequest по умолчанию, поэтому я использовал класс httpRequest от twslankard и настроил его так, чтобы он принимал пользовательские заголовки, такие как (добавлена публичная функция):
public function setHeaders($headers) {
if(is_array($headers)) {
foreach($headers as $name => $val) {
$this->headers[$name] = $val;
}
}
}
И вызывая класс так:
include_once($_SERVER['DOCUMENT_ROOT'].'/functions/class_httprequest.php');
$request = new HttpRequest($url, 'GET');
$request->setHeaders(array(
'api-version' => '2014-09-02',
'authorization' => $key
));
try {
$response = $request->send();
echo $request->getStatus().'<br>';
echo $request->getResponseBody();
} catch (HttpException $ex) {
echo $ex;
}
Используя версию php, она работала, хитрость заключалась в добавлении заголовка api-версии, до этого я получал ошибку http 400 с помощью сценария php.
1 ответ
Используя версию php, она работала, хитрость заключалась в добавлении заголовка api-версии, до этого я получал ошибку http 400 с помощью сценария php.