Выборка из браузера работает, но служба AngularJS $ http имеет ошибку CORS - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы понять, почему не работает служба AngularJS $ http и работает API fetch .

Ниже приведен код AngularJS:

const $http = angular.element(document.body).injector().get('$http')
$http({
  method: 'GET',
  url: 'http://192.168.1.126:8080/saiku/rest/saiku/admin/datasources/',
  headers: {
    'Authorization': 'Basic YWRtaW46YWRtaW4='
  }
})

Это дает мне эту ошибку:

angular.js: 12845 ОПЦИИ http://192.168.1.126:8080/saiku/rest/saiku/admin/datasources/ 403 () Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Происхождение 'http://localhost:8081' поэтому не разрешено. Ответ имеет HTTP-код состояния 403.

Странная часть в том, что это:

fetch('http://192.168.1.126:8080/saiku/rest/saiku/admin/datasources/', {
    method: 'GET',
    headers: {
         'Authorization': 'Basic YWRtaW46YWRtaW4='
    }
}).then((r) => r.json()).then(console.log)

дает мне правильный ответ

Я знаю, что это может быть ошибка CORS, но я добавил фильтр CORS на свой кот, чтобы все работало (и выборка работала). Это ошибка в fetch или в $ http?

1 Ответ

0 голосов
/ 02 мая 2018

Пока я писал этот вопрос, я нашел ответ:

В моем приложении AngularJS был файл конфигурации , который устанавливал это:

$httpProvider.defaults.headers.get['If-Modified-Since'] = '0';

И это (вместе с другими заголовками) делает запрос предварительно выданным , как в документации CORS :

[...] Кроме заголовков, автоматически устанавливаемых пользовательским агентом (для Например, Соединение , Пользователь-агент , или любой другой заголовок с имя, определенное в спецификации Fetch как «имя запрещенного заголовка» ), запрос включает в себя любые заголовки, кроме тех, которые специфицированы определяется как «CORS-safelisted заголовок запроса», которые являются следующее:

  • Accept Accept-Language
  • Content-Language
  • Content-Type (но обратите внимание на дополнительные требования ниже)
  • Last-Event-ID
  • ДНР
  • Сохранить-данные
  • Ширина просмотра
  • Ширина

Таким образом, API извлечения работал, потому что он не устанавливал этот (If-Modified-Since) заголовок, а служба $ http была.

...