Что такое непрозрачный ответ и какой цели он служит?
Я пытался fetch
URL старого сайта, и произошла ошибка:
Fetch API cannot load http://xyz.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://abc' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.
Я понял сообщение и попытался сделать запрос, который возвращает непрозрачный ответ:
fetch("http://xyz", {'mode': 'no-cors'})
Хорошо, теперь это работает... но я не могу это прочитать. знак равно
Какова же цель непрозрачного ответа?
5 ответов
Рассмотрим случай, когда работник службы работает как независимый кеш. Ваша единственная цель - обслуживать те же ресурсы, которые вы получаете из сети, но быстрее. Конечно, вы не можете гарантировать, что все ресурсы будут частью вашего источника (например, рассмотрим библиотеки, обслуживаемые из CDN). Поскольку у работника сервиса есть возможность изменять ответы сети, вам нужно гарантировать, что вы не заинтересованы ни в содержании ответа, ни в его заголовках, ни даже в результате. Вы заинтересованы только в ответе в виде черного ящика, который, возможно, кэширует его и обслуживает его быстрее.
Вот почему { mode: 'no-cors' }
был сделан для.
Непрозрачные ответы не могут быть доступны с помощью JavaScript, но вы все равно можете кэшировать их с помощью Cache API и отвечать на них в fetch
обработчик событий в сервисном работнике. Таким образом, они полезны для перевода вашего приложения в автономный режим, а также для ресурсов, которые вы не можете контролировать (например, ресурсы в CDN, которые не устанавливают заголовки CORS).
Также есть решение для приложения Node JS. CORS Anywhere - это прокси NodeJS, который добавляет заголовки CORS к прокси-запросу.
URL-адрес прокси-сервера буквально берется из пути, проверяется и проксируется. Протокольная часть прокси-адреса URI является необязательной и по умолчанию имеет значение "http". Если указан порт 443, по умолчанию используется протокол "https".
Этот пакет не накладывает никаких ограничений на методы http или заголовки, кроме файлов cookie. Запрашивать учетные данные пользователя запрещено. Приложение может быть сконфигурировано так, чтобы запрашивать заголовок для передачи запроса, например, чтобы избежать прямого посещения браузера. https://robwu.nl/cors-anywhere.html
помог мне однажды, когда я хотел контролировать доступность Интернета для одностраничного приложения. Странице требовался доступ к Интернету, и я хотел быть проинформирован, если это невозможно (из-за сбоя сети или чего-то еще).
У меня был доступ к облачной службе мониторинга, которая принимала push-уведомления, т. е. вы могли отправить HTTP-вызов в службу, и она предупредила бы вас, если не увидела вызова в течение X минут. Мониторинг сердцебиения.
Проблема в том, что этот сервис не раскрывал никаких заголовков CORS (он был предназначен для серверных приложений) иfetch
с моей страницы не получится.
no-cors
на помощь: с помощью этой опции я мог бы отправить свойGET
запрос, но меня не волновал какой-либо ответ. Либо доходит до службы мониторинга и все нормально, либо нет и выдается оповещение.
С javascript немного сложно получить ответ, я исправил его, получив api из бэкэнда, а затем вызвав его во внешний интерфейс.
public function get_typechange () {
$ url = "https://........";
$ json = file_get_contents ($url);
$ data = json_decode ($ json, true);
$ resp = json_encode ($data);
$ error = json_last_error_msg ();
return $ resp;
}