Проблема CORS при вызове API localhost, размещенного на одном порту из другого порта - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть POST-запрос localhost Rest API, размещенный с использованием Docker на порту 8501: http://localhost: 8501 / v1 / models / model: предикат . У меня есть файл HTML, который запускается со скриптом JavaScript, и он размещен на http://127.0.0.1: 8887 / с использованием WebServer для Chrome. Я могу вызывать глобальные POST-запросы Rest API из моих файлов HTML - JS, и мой локальный API Rest работает нормально из POSTMAN. Но я не могу вызвать мой API из моих HTML - JS файлов.

Ниже мой JS файл:

function foo() {        
    var myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/json");
    myHeaders.append("Access-Control-Allow-Origin", "*");
    myHeaders.append("Access-Control-Allow-Methods", "POST");

    var raw = JSON.stringify({"instances":[[0]]});

    var requestOptions = {
        method: 'POST',
        headers: myHeaders,
        body: raw,
        redirect: 'follow'
    };

    fetch("http://localhost:8501/v1/models/model:predict", requestOptions)
        .then(response => console.log(response.text()))
        .then(result => console.log(result))
        .catch(error => console.log('error', error));

}

Я получаю следующую ошибку:

Доступ к выборке в 'http://localhost: 8501 / v1 / models / model: прогноз ' от источника 'http://127.0.0.1: 8887 ' заблокирован согласно политике CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ отвечает вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

На вашем сервере отсутствует заголовок Access-Control-Allow-Origin в ответе, так как он отвечает, что разрешить или нет. См https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

1 голос
/ 18 февраля 2020

Вы, кажется, поняли CORS в обратном направлении - заголовки Access-Control-Allow-Origin и Access-Control-Allow-Methods указаны в HTTP ответах , а не запросах . Это, очевидно, подразумевает, что их устанавливает сервер HTTP, а не клиент.

Это создаст ужасную модель межсайтовой безопасности, если сценарий произвольного происхождения может эффективно диктовать серверу HTTP, какие запросы и из которого происхождение последний должен принять.

Это служба HTTP, которая в конечном итоге контролирует доступ путем указания соответствующих заголовков в ответах, которые она обслуживает, и пользовательский агент проверяет запрос перекрестного источника, когда он отказывается продолжить работу, если сервер не указал, что он разрешает запросы от сценарий был получен из другого источника - ответ будет отброшен, и будет выдано сообщение об ошибке.

Короче говоря, вам нужно добавить заголовки к ответам, которые генерирует ваша служба REST на localhost:8501, вместо указав их для запросов, которые ваш клиентский скрипт создает там, где они ничего не делают.

...