Что такое непрозрачный ответ и какой цели он служит?


172

Я попытался перейти 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'})

Хорошо, теперь это работает ... но я не могу это прочитать. знак равно

Какова же цель непрозрачного ответа?

Ответы:


149

Рассмотрим случай, когда работник службы работает как независимый кеш. Ваша единственная цель - обслуживать те же ресурсы, которые вы получаете из сети, но быстрее. Конечно, вы не можете гарантировать, что все ресурсы будут частью вашего источника (например, рассмотрим библиотеки, обслуживаемые из CDN). Поскольку у работника службы есть возможность изменять сетевые ответы, вы должны гарантировать, что вас не интересует ни содержание ответа, ни его заголовки, ни даже результат. Вы заинтересованы только в ответе в виде черного ящика, который, возможно, кэширует его и обслуживает быстрее.

Это то, что { mode: 'no-cors' }было сделано для.


2
Но Status codeвсегда 0, как проверить, если это было успешно, если status is never 200?
Ангшуман Агарвал

3
Ты не можешь. Это часть черного ящика .
Сальва

67

Непрозрачные ответы не могут быть доступны с помощью JavaScript, но вы все равно можете кэшировать их с помощью Cache API и отвечать с ними в fetchобработчике событий в сервисном работнике. Поэтому они полезны для перевода вашего приложения в автономный режим, а также для ресурсов, которые вы не можете контролировать (например, ресурсы в CDN, которые не устанавливают заголовки CORS).


1

Также есть решение для приложения Node JS. CORS Anywhere - это прокси NodeJS, который добавляет заголовки CORS к прокси-запросу.

URL-адрес прокси-сервера буквально берется из пути, проверяется и проксируется. Протокольная часть прокси-адреса URI является необязательной и по умолчанию имеет значение «http». Если указан порт 443, по умолчанию используется протокол «https».

Этот пакет не накладывает никаких ограничений на методы http или заголовки, кроме файлов cookie. Запрашивать учетные данные пользователя запрещено. Приложение может быть настроено так, чтобы запрашивать заголовок для передачи запроса, например, чтобы избежать прямого посещения браузера. https://robwu.nl/cors-anywhere.html


-2

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;

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.