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.

Другие вопросы по тегам