JavaScript - ошибки XMLHttpRequest, Access-Control-Allow-Origin
Я пытаюсь отправить XMLHttpRequest на сайт вставки. Я отправляю объект, содержащий все поля, которые требует api, но я продолжаю получать эту проблему. Я прочитал этот вопрос, и я подумал:
httpReq.setRequestHeader('Access-Control-Allow-Headers', '*');
Зафиксировал бы это, но это не так. Кто-нибудь есть информация об этой ошибке и/или как я могу ее исправить?
Вот мой код:
(function () {
'use strict';
var httpReq = new XMLHttpRequest();
var url = 'http://paste.ee/api';
var fields = 'key=public&description=test&paste=this is a test paste&format=JSON';
var fields2 = {key: 'public', description: 'test', paste: 'this is a test paste', format: 'JSON'};
httpReq.open('POST', url, true);
console.log('good');
httpReq.setRequestHeader('Access-Control-Allow-Headers', '*');
httpReq.setRequestHeader('Content-type', 'application/ecmascript');
httpReq.setRequestHeader('Access-Control-Allow-Origin', '*');
console.log('ok');
httpReq.onreadystatechange = function () {
console.log('test');
if (httpReq.readyState === 4 && httpReq.status === 'success') {
console.log('test');
alert(httpReq.responseText);
}
};
httpReq.send(fields2);
}());
И вот точный вывод консоли:
good
ok
Failed to load resource: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:40217' is therefore not allowed access. http://paste.ee/api
XMLHttpRequest cannot load http://paste.ee/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:40217' is therefore not allowed access. index.html:1
test
Вот консольный вывод, когда я тестирую его локально на обычном браузере Chromium:
good
ok
XMLHttpRequest cannot load http://paste.ee/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. index.html:1
test
Ответы
Ответ 1
Я думаю, что вы пропустили точку контроля доступа.
Краткая информация о том, почему существует CORS:
Поскольку JS-код с веб-сайта может выполнять XHR, этот сайт может потенциально отправлять запросы на другие сайты, маскируя вас и используя доверие, которое эти сайты имеют в себе (например, если вы вошли в систему, вредоносный сайт может попытаться извлечь информацию или выполнить действий, которые вы никогда не хотели) - это называется атакой CSRF. Чтобы предотвратить это, веб-браузеры имеют очень строгие ограничения на то, что XHR вы можете отправить - вы, как правило, ограничены только своим доменом и т.д.
Теперь иногда полезно, чтобы сайт разрешал другим сайтам связываться с ним - сайты, которые предоставляют API или сервисы, такие как тот, который вы пытаетесь получить, будут первыми кандидатами. CORS был разработан, чтобы позволить сайту A (например, paste.ee
) сказать: "Я доверяю сайту B, поэтому вы можете отправить XHR из него мне". Это определяется сайтом A, отправляющим заголовки "Access-Control-Allow-Origin" в своих ответах.
В вашем конкретном случае кажется, что paste.ee
не хочет использовать CORS. Лучше всего связаться с владельцем сайта и выяснить, почему, если вы хотите использовать paste.ee с браузером script. В качестве альтернативы вы можете попробовать использовать расширение (те должны иметь более высокие привилегии XHR).
Ответ 2
У меня такая же проблема.
Журналы серверов показали:
DEBUG: <-- origin: null
Я исследовал это, и произошло, что это не заполняется, когда я звоню из файла с локального диска. Когда я скопировал файл на сервер и использовал его с сервера - запрос работал отлично.