Na požadovanom prostriedku nie je prítomná žiadna 'Access-Control-Allow-Origin' hlavička - pri pokuse o získanie údajov z rozhrania REST API
Snažím sa získať nejaké údaje z rozhrania REST API spoločnosti HP Alm. S malým curl skriptom to funguje celkom dobre - dostanem svoje údaje.
Teraz sa zdá, že robiť to s JavaScriptom, fetch a ES6 (viac-menej) je väčší problém. Stále dostávam túto chybovú správu:
Fetch API nemôže načítať . Odpoveď na požiadavku preflight doesn't neprešla kontrolou kontroly prístupu: No 'Access-Control-Allow-Origin' header is prítomná na požadovanom zdroji. Pôvod 'http://127.0.0.1:3000' je preto nie je povolený prístup. Odpoveď mala stavový kód HTTP 501. Ak neprehľadná odpoveď slúži vašim potrebám, nastavte režim požiadavky'na 'no-cors' na získanie zdroja s vypnutým CORS.
Chápem, že je to preto, lebo sa snažím načítať tieto údaje z môjho localhostu a riešenie by malo používať CORS. Teraz som si myslel, že som to skutočne urobil, ale nejako to buď ignoruje to, čo napíšem do hlavičky, alebo je problém v niečom inom?
Je teda problém v implementácii? Robím to zle? Do logov servera sa bohužiaľ nemôžem pozrieť. Som tu naozaj trochu zaseknutý.
function performSignIn() {
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');
headers.append('Access-Control-Allow-Origin', 'http://localhost:3000');
headers.append('Access-Control-Allow-Credentials', 'true');
headers.append('GET', 'POST', 'OPTIONS');
headers.append('Authorization', 'Basic ' + base64.encode(username + ":" + password));
fetch(sign_in, {
//mode: 'no-cors',
credentials: 'include',
method: 'POST',
headers: headers
})
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.log('Authorization failed : ' + error.message));
}
Používam prehliadač Chrome. Skúšal som použiť aj ten Chrome CORS Plugin, ale potom dostávam ďalšiu chybovú správu:
Hodnota hlavičky 'Access-Control-Allow-Origin' v odpovedi
nesmie byť zástupný znak '*', keď je režim poverenia požiadavky'na 'include'. Pôvod 'http://127.0.0.1:3000' preto nie je povolený prístup. Režim poverení pri požiadavkách iniciovaných XMLHttpRequest je riadený atribútom withCredentials.
Táto odpoveď zahŕňa veľa tém, preto je rozdelená do troch častí:
Ako vyriešiť problémy "Hlavička Access-Control-Allow-Origin nesmie byť zástupným znakom "
Ako použiť proxy server CORS na obídenie problémov "Žiadna hlavička Access-Control-Allow-Origin " Ak nemáte kontrolu nad serverom, na ktorý váš frontendový kód JavaScriptu posiela požiadavku, a problém s odpoveďou z tohto servera spočíva len v absencii potrebnej hlavičky
Access-Control-Allow-Origin
, stále môžete dosiahnuť, aby všetko fungovalo - požiadavku môžete odoslať prostredníctvom proxy servera CORS. Aby sme ukázali, ako to funguje, najprv uvedieme kód, ktorý nepoužíva proxy server CORS:Dôvodom, prečo sa tam zasiahne blok
catch
je, že prehliadač bráni tomuto kódu v prístupe k odpovedi, ktorá sa vracia zhttps://example.com
. A dôvodom, prečo to prehliadač robí, je, že v odpovedi chýba hlavička odpovedeAccess-Control-Allow-Origin
. Teraz je tu presne ten istý príklad, ale len s pridaným CORS proxy:Poznámka: Ak je https://cors-anywhere.herokuapp.com pri pokuse nefunkčný alebo nedostupný, potom si pozrite nižšie postup, ako nasadiť vlastný server CORS Anywhere na Heroku za 2-3 minúty. Druhý úryvok kódu uvedený vyššie môže úspešne pristupovať k odpovedi, pretože prevzatie adresy URL požiadavky a jej zmena na https://cors-anywhere.herokuapp.com/https://example.com-by len s prefixom URL proxy servera spôsobí, že požiadavka sa uskutoční prostredníctvom tohto proxy servera, ktorý potom:
https://example.com
.https://example.com
.Access-Control-Allow-Origin
.Access-Control-Allow-Origin
prehliadač vidí. Pomocou kódu z https://github.com/Rob--W/cors-anywhere/. Funguje to celkom dobre s malým skriptom curl - dostanem svoje údaje. Ak chcete správne testovať pomocoucurl
, musíte emulovať požiadavkuOPTIONS
pred odoslaním, ktorú posiela prehliadač:...pričom
https://the.sign_in.url
je nahradené akoukoľvek skutočnou adresou URLsign_in
. Odpoveď, ktorú prehliadač potrebuje vidieť z tejto požiadavkyOPTIONS
, musí obsahovať hlavičky, ako je táto:Ak odpoveď
OPTIONS
neobsahuje tieto hlavičky, prehliadač sa zastaví na tomto mieste a nikdy sa ani nepokúsi odoslať požiadavkuPOST
. Takisto stavový kód HTTP pre odpoveď musí byť 2xx - typicky 200 alebo 204. Ak je to akýkoľvek iný stavový kód, prehliadač sa zastaví na tomto mieste. Server v otázke odpovedá na požiadavkuOPTIONS
stavovým kódom 501, čo zrejme znamená, že sa snaží naznačiť, že neimplementuje podporu pre požiadavkyOPTIONS
. Ostatné servery v tomto prípade zvyčajne odpovedajú stavovým kódom 405 "Metóda nie je povolená". Nikdy teda nebudete môcť z vášho frontendového kódu JavaScriptu priamo zadávať požiadavkyPOST
na tento server, ak server na túto požiadavkuOPTIONS
odpovie kódom 405 alebo 501 alebo iným kódom ako 200 alebo 204, alebo ak neodpovie týmito potrebnými hlavičkami odpovede. Spôsob, ako sa vyhnúť spusteniu preflightu pre prípad uvedený v otázke, by bol nasledovný:Authorization
, ale namiesto toho by sa (napríklad) spoliehal na autentifikačné údaje vložené do tela požiadavkyPOST
alebo ako parameter dotazuak server nevyžadoval, aby telo
POST
obsahovalo mediálny typContent-Type: application/json
, ale namiesto toho prijal teloPOST
akoapplication/x-www-form-urlencoded
s parametrom s názvomjson
(alebo akýmkoľvek iným), ktorého hodnotou sú údaje JSONAko opraviť problémy s "Access-Control-Allow-Origin header must not be the wildcard "
Ale to je len jeden príklad; iné (webové) serverové systémy poskytujú podobné spôsoby na echo hodnôt pôvodu.
Odstráňte tieto riadky. Hlavičky
Access-Control-Allow-*
sú hlavičky odpovede. Nikdy ich nechcete posielať v požiadavke. Jediný účinok, ktorý to bude mať, je spustenie prehliadača, aby vykonal preflight.Táto chyba sa vyskytne, keď sa nezhoduje adresa URL klienta a adresa URL servera vrátane čísla portu. V takom prípade je potrebné povoliť službu pre CORS, čo je zdieľanie zdrojov medzi jednotlivými pôvodcami.
Ak hostujete službu Spring REST, potom ju nájdete v príspevku na blogu CORS support in Spring Framework.
Ak hostujete službu pomocou servera Node.js, potom
Zastavte server Node.js.
npm install cors --save
Do súboru server.js pridajte nasledujúce riadky
var cors = require('cors')
app.use(cors()) // Toto použite za deklaráciou premennej
Odstráňte to: