Що таке непрозора реакція і якій цілі вона служить?


172

Я спробував вказати fetchURL старого веб-сайту, і сталася помилка:

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
Ви не можете. Він є частиною blackbox .
Сальва

67

Непрозорі відповіді не можуть бути доступні JavaScript, але ви все одно можете кешувати їх за допомогою 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.