Proberen om fetch en pass te gebruiken in mode: no-cors
Ik kan dit eindpunt, http://catfacts-api.appspot.com/api/facts?number=99
benaderen via Postman en het retourneert JSON
Bovendien gebruik ik create-react-app en wil ik het opzetten van een server configuratie vermijden.
In mijn client code probeer ik fetch
te gebruiken om hetzelfde te doen, maar ik krijg de foutmelding:
No 'Access-Control-Allow-Origin' header is aanwezig op de gevraagde bron. Origin 'http://localhost:3000' is daarom niet toegestaan toegang. Als een ondoorzichtig antwoord uw behoeften dient, stel het verzoek's mode op 'no-cors' om de bron op te halen met CORS uitgeschakeld.
Dus ik probeer een object door te geven aan mijn Fetch dat CORS uitschakelt, zoals dit:
fetch('http://catfacts-api.appspot.com/api/facts?number=99', { mode: 'no-cors'})
.then(blob => blob.json())
.then(data => {
console.table(data);
return data;
})
.catch(e => {
console.log(e);
return e;
});
Interessant genoeg is de fout die ik krijg eigenlijk een syntaxisfout met deze functie. Ik weet niet zeker of mijn eigenlijke fetch
kapot is, want als ik het { mode: 'no-cors' } object verwijder, en het een andere URL geef werkt het prima.
Ik heb ook geprobeerd om het object { mode: 'opaque'}
in te voeren, maar dit geeft de originele fout van hierboven.
Ik geloof dat alles wat ik moet doen is CORS uitschakelen. Wat zie ik over het hoofd?
Het toevoegen van
mode: 'no-cors'
zal de dingen niet op magische wijze laten werken. In feite maakt het dingen erger, omdat een effect dat het heeft is om browsers te vertellen, "Blokkeer mijn frontend JavaScript code van het kijken naar de inhoud van het antwoord lichaam en headers onder alle omstandigheden. " Natuurlijk is dat bijna nooit wat je wilt. Wat er gebeurt met cross-origin verzoeken van frontend JavaScript is dat browsers standaard frontend code blokkeren van cross-origin toegang tot bronnen. Als een siteAccess-Control-Allow-Origin
meestuurt in zijn antwoorden, dan zullen browsers die blokkade versoepelen en jouw code toegang geven tot het antwoord. Maar als een site geenAccess-Control-Allow-Origin
header meestuurt in zijn antwoorden, dan is er geen enkele manier waarop je frontend code direct toegang kan krijgen tot antwoorden van die site. In het bijzonder, je kunt het niet oplossen doormode: 'no-cors'
te specificeren (in feite zal dat zorgen dat je frontend code geen toegang heeft tot de inhoud van het antwoord). Echter, een ding dat wel werkt is als je je verzoek via [een CORS proxy][1] stuurt, zoals dit:Note: als je https://cors-anywhere.herokuapp.com probeert te gebruiken, vind je dat het down is, je kunt ook gemakkelijk je eigen proxy deployen naar Heroku in letterlijk slechts 2-3 minuten, met 5 commando's:
Na het uitvoeren van deze commando's, zul je eindigen met je eigen CORS Anywhere server draaiend op, bijvoorbeeld, https://cryptic-headland-94862.herokuapp.com/. Dus in plaats van het voorvoegsel van uw verzoek URL met
https://cors-anywhere.herokuapp.com
, voorvoegsel het in plaats daarvan met de URL voor uw eigen instantie; bijvoorbeeld, https://cryptic-headland-94862.herokuapp.com/https://example.com.De oplossing voor mij was om het gewoon server side te doen
Ik gebruikte de C#
WebClient
bibliotheek om de gegevens op te halen (in mijn geval waren het afbeeldingsgegevens) en terug te sturen naar de client. Er is waarschijnlijk iets soortgelijks in de server-side taal van jouw keuze.Je kunt het aanpassen aan je eigen gebruikssituatie. Het belangrijkste punt is dat
client.DownloadData()
werkte zonder CORS-fouten. Normaal gesproken zijn CORS problemen alleen tussen websites, vandaar dat het goed is om 'cross-site' verzoeken te doen vanaf je server.Dan is de React fetch call zo simpel als:
Zeer gemakkelijke oplossing (2 min om te configureren) is om het local-ssl-proxy pakket van
npm
te gebruikenHet gebruik is rechttoe rechtaan:
1. Installeer het pakket:
npm install -g local-ssl-proxy
2. Tijdens het draaien van je
local-server
maskeer deze met delocal-ssl-proxy --source 9001 --target 9000
P.S: Vervang
-target 9000
door de-- "nummer van je poort"
en-source 9001
door-source "nummer van je poort +1"