mode: 'no-cors'
non farà magicamente far funzionare le cose. In effetti, le cose peggiorano, perché un effetto che ha è quello di dire ai browser: "Impedisci al mio codice JavaScript front-end di guardare i contenuti del corpo della risposta e delle intestazioni in ogni circostanza". Ovviamente non lo vuoi quasi mai.
Ciò che accade con le richieste di origine incrociata da JavaScript frontend è che i browser per impostazione predefinita impediscono al codice frontend di accedere alle risorse di origine incrociata. Se Access-Control-Allow-Origin
è presente una risposta, i browser rilasseranno tale blocco e consentiranno al codice di accedere alla risposta.
Ma se un sito invia no Access-Control-Allow-Origin
nelle sue risposte, il tuo codice frontend non può accedere direttamente alle risposte da quel sito. In particolare, non è possibile risolverlo specificando mode: 'no-cors'
(in realtà ciò garantirà che il codice frontend non possa accedere ai contenuti della risposta).
Tuttavia, una cosa che sarà lavorare: se si invia una richiesta tramite un proxy CORS , in questo modo:
var proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = 'http://catfacts-api.appspot.com/api/facts?number=99'
fetch(proxyUrl + targetUrl)
.then(blob => blob.json())
.then(data => {
console.table(data);
document.querySelector("pre").innerHTML = JSON.stringify(data, null, 2);
return data;
})
.catch(e => {
console.log(e);
return e;
});
<pre></pre>
Nota: se quando vai a provare a utilizzare https://cors-anywhere.herokuapp.com, trovi che è inattivo , puoi anche distribuire facilmente il tuo proxy su Heroku in letteralmente solo 2-3 minuti, con 5 comandi:
git clone https://github.com/Rob--W/cors-anywhere.git
cd cors-anywhere/
npm install
heroku create
git push heroku master
Dopo aver eseguito questi comandi, finirai con il tuo server CORS Anywhere in esecuzione su, ad esempio, https://cryptic-headland-94862.herokuapp.com/ . Quindi, anziché aggiungere il prefisso all'URL della richiesta https://cors-anywhere.herokuapp.com
, prefisso invece l'URL per la tua istanza; ad esempio, https://cryptic-headland-94862.herokuapp.com/https://example.com .
Posso raggiungere questo endpoint, http://catfacts-api.appspot.com/api/facts?number=99
tramite Postman
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS spiega perché, nonostante sia possibile accedere alla risposta con Postman, i browser non ti consentono di accedere alla risposta tra origini dal frontend Codice JavaScript in esecuzione in un'app Web a meno che la risposta non includa Access-Control-Allow-Origin
un'intestazione di risposta.
http://catfacts-api.appspot.com/api/facts?number=99 non ha Access-Control-Allow-Origin
un'intestazione di risposta, quindi non è possibile che il tuo codice frontend possa accedere all'origine incrociata della risposta.
Il tuo browser può ottenere la risposta bene e puoi vederlo in Postman e persino negli sviluppatori del browser, ma ciò non significa che i browser lo esporranno al tuo codice. Non lo faranno, perché non ha Access-Control-Allow-Origin
un'intestazione di risposta. Quindi devi invece usare un proxy per ottenerlo.
Il proxy effettua la richiesta a quel sito, ottiene la risposta, aggiunge l' Access-Control-Allow-Origin
intestazione della risposta e qualsiasi altra intestazione CORS necessaria, quindi la restituisce al codice richiedente. E quella risposta con l' Access-Control-Allow-Origin
intestazione aggiunta è ciò che vede il browser, quindi il browser consente al tuo codice frontend di accedere effettivamente alla risposta.
Quindi sto cercando di passare un oggetto al mio Fetch che disabiliterà CORS
Non vuoi farlo. Per essere chiari, quando dici di voler "disabilitare CORS" sembra che tu voglia effettivamente disabilitare la stessa politica di origine . Lo stesso CORS è in realtà un modo per farlo - CORS è un modo per allentare la stessa politica di origine, non un modo per limitarla.
Tuttavia, è vero che puoi - solo nel tuo ambiente locale - fare cose come dare ai flag di runtime del browser per disabilitare la sicurezza ed eseguire in modo non sicuro, oppure puoi installare un'estensione del browser localmente per aggirare la stessa politica di origine, ma tutto ciò che fa è cambiare la situazione solo per te a livello locale.
Indipendentemente da ciò che cambi localmente, chiunque cerchi di utilizzare la tua app continuerà a seguire la stessa politica di origine e non è possibile disabilitarlo per gli altri utenti della tua app.
Molto probabilmente non vorrai mai usare mode: 'no-cors'
in pratica, tranne in alcuni casi limitati , e anche solo allora saprai esattamente cosa stai facendo e quali sono gli effetti. Questo perché l'impostazione mode: 'no-cors'
che dice effettivamente al browser è: "Impedisci al mio codice JavaScript front-end di esaminare il contenuto del corpo della risposta e le intestazioni in ogni circostanza". Nella maggior parte dei casi, ovviamente, non è proprio quello che vuoi.
Per quanto riguarda i casi in cui vorresti prendere in considerazione l'utilizzo mode: 'no-cors'
, vedi la risposta in Quali limiti si applicano alle risposte opache? per i dettagli. L'essenza di ciò è che i casi sono:
Nel caso limitata quando si sta utilizzando Javascript per mettere i contenuti da un altro l'origine in una <script>
, <link rel=stylesheet>
, <img>
, <video>
, <audio>
, <object>
, <embed>
, o <iframe>
elemento (che funziona perché l'incasso di risorse: Cross-origine è consentito per quelli) - ma per qualche ragione si don' non voglio o non posso farlo semplicemente facendo in modo che il markup del documento utilizzi l'URL della risorsa come attributo href
o src
per l'elemento.
Quando l'unica cosa che vuoi fare con una risorsa è memorizzarla nella cache. Come indicato nella risposta Quali limiti si applicano alle risposte opache? , in pratica lo scenario a cui si applica è quando si utilizzano Service Workers, nel qual caso l'API pertinente è l' API di archiviazione cache .
Ma anche in quei casi limitati, ci sono alcuni aspetti importanti di cui tenere conto; vedere la risposta in Quali limitazioni si applicano alle risposte opache? per i dettagli.
Ho anche provato a passare l'oggetto { mode: 'opaque'}
Non esiste una mode: 'opaque'
modalità di richiesta: opaque
è invece solo una proprietà della risposta e i browser impostano quella proprietà opaca sulle risposte dalle richieste inviate con la no-cors
modalità.
Ma per inciso la parola opaco è un segnale piuttosto esplicito sulla natura della risposta con cui si finisce: "opaco" significa che non è possibile vederlo.
cors-anywhere
soluzione alternativa per semplici casi d'uso non-prod (ad esempio recuperare alcuni dati disponibili al pubblico). Questa risposta conferma il mio sospetto cheno-cors
non è comune perché la sua OpaqueResponse non è molto utile; vale a dire "casi molto limitati"; qualcuno può spiegarmi esempi doveno-cors
è utile?