JavaScript API биллинга JavaScript возвращает ошибку CORS, но не при использовании почтальона

Я в растерянности сейчас. Я пытаюсь достичь Azure Billing & API использования через мое приложение php, но продолжаю получать следующую ошибку:

XMLHttpRequest не может загрузить
https://ea.azure.com/rest/{} / agreementnumber использование-отчеты. Ответ на
предпечатная проверка не проходит проверку контроля доступа: нет
Заголовок «Access-Control-Allow-Origin» присутствует в запрошенном
ресурс. ПроисхождениеHTTP: // локальныйПоэтому не допускается доступ.

Я знаю, что ссылка упоминает 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 class с помощью 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.

1

Другие решения

Других решений пока нет …