В случаях, подобных этому, когда сервер, на который вы пытаетесь сделать запрос из разных источников, не отправляет заголовок ответа Access-Control-Allow-Origin
, ваш единственный вариант, если вы хотите сделать запрос на этот сервер из внешнего кода JavaScript, запущенного в браузере. , заключается в использовании прокси-сервера CORS. В противном случае ваш браузер не позволит вашему внешнему коду JavaScript получить доступ к ответу.
Итак, вы можете выполнить свой запрос, если измените свой код, чтобы он имел что-то вроде этого:
var proxyURL = 'https://cors-anywhere.herokuapp.com';
var requestURL = 'https://api.kraken.com/0/public/OHLC?pair=ETHEUR';
var request = new XMLHttpRequest();
request.open('GET', proxyURL + '/' + requestURL, true);
Это отправляет запрос через https://cors-anywhere.herokuapp.com, который перенаправляет запрос на https://api.kraken.com/0/public/OHLC?pair=ETHEUR
, а затем получает ответ. Бэкэнд https://cors-anywhere.herokuapp.com
добавляет к ответу заголовок Access-Control-Allow-Origin
и передает его обратно в запрашивающий код внешнего интерфейса.
Затем браузер позволит вашему коду внешнего интерфейса получить доступ к ответу, потому что этот ответ с заголовком ответа Access-Control-Allow-Origin
- это то, что браузер видит.
Вы также можете легко настроить собственный прокси-сервер CORS, используя https://github.com/Rob--W/cors-anywhere/
Также обратите внимание, что request.setRequestHeader('Access-Control-Allow-Origin','*')
необходимо удалить из кода внешнего интерфейса, с помощью которого вы делаете запрос (как указано в комментариях выше).
Это потому, что Access-Control-Allow-Origin
- это строго заголовок ответа, который серверы должны отправлять в ответах; отправка его со стороны клиента в запросе не будет иметь никакого эффекта, кроме как заставить ваш браузер выполнить ненужное запрос CORS preflight OPTIONS, который завершится ошибкой.
Для получения подробной информации о том, что браузеры делают, когда вы отправляете запросы из разных источников из внешнего кода JavaScript с помощью XHR или методов Fetch API или AJAX из библиотек JavaScript, а также подробности о том, какие заголовки ответов должны быть получены, чтобы браузеры разрешили внешнему коду доступ к ответы - см. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS.
var proxyURL = 'https://cors-anywhere.herokuapp.com';
var requestURL = 'https://api.kraken.com/0/public/OHLC?pair=ETHEUR';
var request = new XMLHttpRequest();
request.open('GET', proxyURL + '/' + requestURL, true);
request.responseType = 'json';
request.onload = function() {
var data = request.response;
document.querySelector('pre').textContent = JSON.stringify(data, null, 2);
}
request.send();
<pre></pre>
person
sideshowbarker
schedule
11.08.2017
request.setRequestHeader('Access-Control-Allow-Origin','*')
? - person guest271314   schedule 11.08.2017Access-Control-Allow-Origin
На запрошенном ресурсе отсутствует заголовок 'Access-Control-Allow-Origin'. Вы пытаетесь создатьXMLHttpRequest()
изfile:
протокола? - person guest271314   schedule 11.08.2017--allow-file-access-from-files
см. Чтение локального XML с помощью JS - person guest271314   schedule 11.08.2017