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

Я исследовал это, и произошло, что это не заполняется, когда я звоню из файла с локального диска. Когда я скопировал файл на сервер и использовал его с сервера - запрос работал отлично.