2016-03-29 31 views
75

Ho provato a fetch l'URL di un vecchio sito web, e un errore è accaduto:Che cos'è una richiesta opaca e per cosa serve?

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. 

ho capito il messaggio, e ha cercato di fare una richiesta opaca:

fetch("http://xyz", {'mode': 'no-cors'}) 

Ok, ora funziona ... ma non riesco a leggerlo. = \

Qual è lo scopo quindi, di una richiesta opaca?

risposta

69

Considerare il caso in cui un addetto al servizio agisce come una cache agnostica. Il tuo unico obiettivo è servire le stesse risorse che otterresti dalla rete ma più velocemente. Ovviamente non è possibile garantire che tutte le risorse faranno parte dell'origine (ad esempio, considera le biblioteche servite dai CDN). Poiché il lavoratore del servizio ha il potenziale di alterare le risposte della rete, è necessario garantire che non si è interessati al contenuto della risposta, né alle intestazioni e nemmeno al risultato. Ti interessa solo la risposta come una scatola nera per eventualmente memorizzarla nella cache e servirla più velocemente.

Questo è il motivo per cui è stato creato { mode: 'no-cors' }.

46

JavaScript non può accedere a risposte opache, ma è comunque possibile memorizzarle nella cache con Cache API e rispondere con esse nel gestore eventi fetch in un addetto all'assistenza. Pertanto sono utili per rendere la tua app offline, anche per risorse che non puoi controllare (ad esempio, risorse su un CDN che non imposta le intestazioni CORS).

0

C'è anche una soluzione per l'app Node JS. CORS Anywhere è un proxy NodeJS che aggiunge intestazioni CORS alla richiesta inoltrata.

L'URL del proxy è letteralmente preso dal percorso, convalidato e inoltrato. La parte del protocollo dell'URI proxy è facoltativa e il valore predefinito è "http". Se viene specificata la porta 443, il protocollo passa automaticamente a "https".

Questo pacchetto non pone alcuna restrizione sui metodi o intestazioni http, ad eccezione dei cookie. La richiesta di credenziali utente non è consentita. L'app può essere configurata per richiedere un'intestazione per il proxy di una richiesta, ad esempio per evitare una visita diretta dal browser. https://robwu.nl/cors-anywhere.html