Che cos'è una risposta opaca e che scopo ha?


172

Ho provato fetchall'URL di un vecchio sito Web e si è verificato un errore:

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 ho provato a fare una richiesta che restituisce una risposta opaca:

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

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

Qual è lo scopo di una risposta opaca?

Risposte:


149

Considerare il caso in cui un lavoratore dell'assistenza agisca come cache agnostica. Il tuo unico obiettivo è servire le stesse risorse che otterresti dalla rete, ma più velocemente. Ovviamente non puoi assicurarti che tutte le risorse facciano parte della tua origine (ad esempio, considera le librerie fornite da CDN). Poiché il personale dell'assistenza ha il potenziale di alterare le risposte della rete, è necessario garantire di non essere interessati al contenuto della risposta, né alle sue intestazioni, né al risultato. Sei interessato solo alla risposta come una scatola nera per possibilmente memorizzarla nella cache e servirla più velocemente.

Questo è ciò per cui è { mode: 'no-cors' }stato creato.


2
Ma Status codeè sempre 0, come verificare se ha avuto successo se status is never 200?
Angshuman Agarwal,

3
Non puoi. Fa parte della blackbox .
Salva

67

Le risposte opache non sono accessibili da JavaScript, ma è comunque possibile memorizzarle nella cache con l' API Cache e rispondere con esse nel fetchgestore eventi in un operatore del servizio. Quindi sono utili per rendere offline la tua app, anche per risorse che non puoi controllare (ad es. Risorse su una rete CDN che non imposta le intestazioni CORS).


1

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

L'URL del proxy viene 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 predefinito è "https".

Questo pacchetto non pone alcuna limitazione ai metodi o alle 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


-2

javascript è un po 'difficile ottenere la risposta, l'ho risolto ottenendo l'api dal backend e quindi chiamandolo al frontend.

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;

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.