Разрешить заголовок Access-Control-Allow-Origin с использованием API-интерфейсов HTML5

Я использую API выборки HTML5.

var request = new Request('https://davidwalsh.name/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, 'j' is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

Я могу использовать нормальный JSON, но не могу получить данные вышеуказанного URL-адреса. Выдает ошибку:

Fetch API не может загрузить https://davidwalsh.name/demo/arsenal.json. В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Поэтому происхождение ' http://localhost ' не разрешено. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса "no-cors", чтобы получить ресурс с отключенным CORS.

Ответы

Ответ 1

Как сказал epascarello, сервер, на котором размещен ресурс, должен иметь CORS. Что вы можете сделать на стороне клиента (и, вероятно, о том, что вы думаете), задает режим извлечения в CORS (хотя это значение по умолчанию я считаю):

fetch(request, {mode: 'cors'});

Однако это все еще требует, чтобы сервер также включил CORS и разрешил вашему домену запрашивать ресурс.

Просмотрите документацию CORS и это потрясающее видео Udacity, объясняющее политику одинакового происхождения.

Вы также можете использовать режим no-cors на стороне клиента, но это просто даст вам непрозрачный ответ (вы не можете прочитать тело, но ответ может быть кэширован работником службы или использован некоторыми API, например <img>):

fetch(request, {mode: 'no-cors'})
.then(function(response) {
  console.log(response); 
}).catch(function(error) {  
  console.log('Request failed', error)  
});

Ответ 2

Мой внешний код запущен в http://localhost:3000, а мой API (внутренний код) работает в http://localhost:5000

Использовал API выборки для вызова API. Изначально это была ошибка "cors". Затем добавил этот код ниже в код моего Backend API, что позволяет использовать источник и заголовок из любого места.

let allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', "*");
  res.header('Access-Control-Allow-Headers', "*");
  next();
}
app.use(allowCrossDomain);

Однако вы должны ограничить свое происхождение в случае других сред, таких как stage, prod.

Ответ 3

Я знаю, что это старый пост, но я обнаружил, что для исправления этой ошибки мне понадобилось использовать IP-адрес моего сервера вместо использования имени домена в моем запросе на выборку. Так, например:

#(original) var request = new Request('https://davidwalsh.name/demo/arsenal.json');
#use IP instead
var request = new Request('https://0.0.0.0/demo/arsenal.json');

fetch(request).then(function(response) {
    // Convert to JSON
    return response.json();
}).then(function(j) {
    // Yay, 'j' is a JavaScript object
    console.log(JSON.stringify(j));
}).catch(function(error) {
    console.log('Request failed', error)
});

Ответ 4

Если вы используете nginx, попробуйте это

#Control-Allow-Origin access

    # Authorization headers aren't passed in CORS preflight (OPTIONS) calls. Always return a 200 for options.
    add_header Access-Control-Allow-Credentials "true" always;
    add_header Access-Control-Allow-Origin "https://URL-WHERE-ORIGIN-FROM-HERE " always;
    add_header Access-Control-Allow-Methods "GET,OPTIONS" always;
    add_header Access-Control-Allow-Headers "x-csrf-token,authorization,content-type,accept,origin,x-requested-with,access-control-allow-origin" always;

    if ($request_method = OPTIONS ) {
        return 200;
    }

Ответ 5

Это сработало для меня:

npm install -g local-cors-proxy

Конечная точка API, которую мы хотим запросить, имеет проблемы с CORS:

https://www.yourdomain.com/test/list

Запустите прокси-сервер:

lcp --proxyUrl https://www.yourdomain.com

 Proxy Active 

 Proxy Url: http://www.yourdomain.com:28080
 Proxy Partial: proxy
 PORT: 8010

Затем в вашем клиентском коде новая конечная точка API:

http://localhost:8010/proxy/test/list

Конечным результатом будет запрос к https://www.yourdomain.ie/test/list без проблем с CORS!