Pyydetyssä resurssissa ei ole 'Access-Control-Allow-Origin' -otsikkoa, kun yritetään saada tietoja REST API:sta.
Yritän hakea tietoja HP Almin REST API:sta. Se toimii melko hyvin pienellä curl-skriptillä - saan tietoni.
Nyt JavaScriptin, fetchin ja ES6:n (enemmän tai vähemmän) käyttö näyttää olevan suurempi ongelma. Saan jatkuvasti tämän virheilmoituksen:
Fetch API cannot load . Vastaus esivalmistelupyyntöön ei't. läpäise pääsynvalvontatarkastusta: Ei 'Access-Control-Allow-Origin' -otsikkoa on ei ole pyydetyssä resurssissa. Origin 'http://127.0.0.1:3000' on ei siis ole sallittu pääsy. Vastauksen HTTP-tilakoodi oli 501. Jos läpinäkymätön vastaus palvelee tarpeitasi, aseta pyynnön tilaksi's mode. 'no-cors' noutaaksesi resurssin, jonka CORS on poistettu käytöstä.
Ymmärtääkseni tämä johtuu siitä, että yritän noutaa kyseistä tietoa localhostista ja ratkaisun pitäisi käyttää CORSia. Nyt luulin, että olen itse asiassa tehnyt sen, mutta jotenkin se joko jättää huomiotta sen, mitä kirjoitan otsikkoon, tai ongelma on jotain muuta?
Onko kyse siis toteutuksesta? Teenkö sen väärin? En valitettavasti voi tarkistaa palvelimen lokitietoja. Olen todella vähän jumissa tässä.
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));
}
Käytän Chromea. Yritin myös käyttää tuota Chrome CORS Pluginia, mutta sitten saan toisen virheilmoituksen:
Vastauksessa olevan 'Access-Control-Allow-Origin' -otsakkeen arvo ei saa olla jokerimerkki '*' kun pyynnön'valtuustietojen tila on 'include'. Origin 'http://127.0.0.1:3000' ei siis ole sallittu. pääsy. Valtakirjojen tila pyynnöissä, jotka on käynnistetty komennolla XMLHttpRequest -pyyntöä ohjataan withCredentials -attribuutilla.
Vastaus kattaa paljon asioita, joten se on jaettu kolmeen osaan:
Miten korjata "Access-Control-Allow-Origin -otsikko ei saa olla jokerimerkki " -ongelmat?
Kuinka käyttää CORS-välityspalvelinta "Access-Control-Allow-Origin -otsikkoa ei sallita " ongelmien kiertämiseen**. Jos et hallitse palvelinta, jolle etusivun JavaScript-koodisi lähettää pyynnön, ja palvelimen vastauksen ongelma on vain tarvittavan
Access-Control-Allow-Origin
-otsikon puuttuminen, voit silti saada asiat toimimaan tekemällä pyynnön CORS-välityspalvelimen kautta. Näyttääksemme, miten se toimii, tässä on ensin koodia, joka ei käytä CORS-välityspalvelinta:Syy, miksi
catch
-lohko osuu sinne, on se, että selain estää koodia pääsemästä käsiksi vastaukseen, joka tulee takaisinhttps://example.com
. Syy siihen on se, että vastauksesta puuttuuAccess-Control-Allow-Origin
-vastausotsikko. Tässä on täsmälleen sama esimerkki, mutta siihen on lisätty CORS-välityspalvelin:Huomautus: Jos https://cors-anywhere.herokuapp.com on alhaalla tai ei ole käytettävissä, kun yrität sitä, niin katso alta, miten voit ottaa käyttöön oman CORS Anywhere -palvelimesi Herokussa vain 2-3 minuutissa. Yllä oleva toinen koodinpätkä voi käyttää vastausta onnistuneesti, koska pyynnön URL-osoitteen muuttaminen muotoon https://cors-anywhere.herokuapp.com/https://example.com-by ja sen muuttaminen vain välityspalvelimen URL-osoitteen etuliitteeksi aiheuttaa sen, että pyyntö tehdään välityspalvelimen kautta, joka sitten:
https://example.com
.Access-Control-Allow-Origin
-otsikon.Access-Control-Allow-Origin
-vastausotsikko. Voit helposti käyttää omaa välityspalvelinta käyttäen https://github.com/Rob--W/cors-anywhere/.Voit myös helposti ottaa oman välityspalvelimen käyttöön Herokussa kirjaimellisesti vain 2-3 minuutissa, 5 komennolla:
Kun olet suorittanut nuo komennot, sinulla on lopulta oma CORS Anywhere -palvelimesi, joka toimii esimerkiksi osoitteessa https://cryptic-headland-94862.herokuapp.com/. Sen sijaan, että pyyntönumerosi URL-osoitteen etuliitteeksi laitetaan
https://cors-anywhere.herokuapp.com
, laitetaan sen sijaan oman instanssisi URL-osoite, esim. https://cryptic-headland-94862.herokuapp.com/https://example.com. Jos siis kun yrität käyttää https://cors-anywhere.herokuapp.com -palvelinta, huomaat, että se on alhaalla (kuten joskus käy), harkitse Heroku-tilin hankkimista (jos sinulla ei vielä ole) ja käytä 2-3 minuuttia edellä esitettyjen ohjeiden tekemiseen, jotta voit ottaa oman CORS Anywhere -palvelimesi käyttöön Herokussa. Riippumatta siitä, käytätkö omaa tai https://cors-anywhere.herokuapp.com tai muuta avointa välityspalvelinta, tämä ratkaisu toimii, vaikka pyyntö olisi sellainen, joka saa selaimet tekemään CORS-esivalvontapyynnön "OPTIONS" - koska siinä tapauksessa välityspalvelin lähettää takaisin myös "Access-Control-Allow-Headers"- ja "Access-Control-Allow-Methods"-otsakkeet, joita tarvitaan esivalvonnan onnistumiseen.Miten vältetään CORS-esivalo Kysymyksessä oleva koodi käynnistää CORS-esivalvonnan, koska se lähettää
Authorization
-otsikon. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests Ilman sitäkinContent-Type: application/json
-otsake aiheuttaisi esivalmistuksen. Mitä "preflight" tarkoittaa: ennen kuin selain yrittää kysymyksessä olevan koodinPOST
-ohjelmaa, se lähettää ensin palvelimelleOPTIONS
-pyynnön selvittääkseen, suostuuko palvelin vastaanottamaan cross-originPOST
-ohjelmaa, joka sisältääAuthorization
- jaContent-Type: application/json
-otsikot....jossa
https://the.sign_in.url
on korvattu todellisella URL-osoitteellasi, joka onsign_in
. Vastauksen, jonka selaimen on nähtävä tuostaOPTIONS
-pyynnöstä, on sisällettävä tämän kaltaisia otsikoita:Jos
OPTIONS
-vastaus ei sisällä näitä otsikoita, selain pysähtyy siihen eikä edes yritä lähettääPOST
-pyyntöä. Lisäksi vastauksen HTTP-tilakoodin on oltava 2xx - tyypillisesti 200 tai 204. Jos se on jokin muu tilakoodi, selain pysähtyy heti. Kyseinen palvelin vastaa "OPTIONS"-pyyntöön tilakoodilla 501, mikä ilmeisesti tarkoittaa, että se yrittää osoittaa, ettei se tue "OPTIONS"-pyyntöjä. Muut palvelimet vastaavat tässä tapauksessa yleensä tilakoodilla 405 "Method not allowed". Et siis koskaan pysty tekemäänPOST
-pyyntöjä suoraan kyseiselle palvelimelle etusivun JavaScript-koodistasi, jos palvelin vastaaOPTIONS
-pyyntöön 405- tai 501-statuksella tai muulla kuin 200- tai 204-statuksella tai jos se ei vastaa tarvittavilla vastausotsikoilla. Tapa välttää preflightin käynnistäminen kysymyksessä mainitussa tapauksessa olisi seuraava:Authorization
-pyyntöotsikkoa, vaan sen sijaan (esimerkiksi) luottaisiPOST
-pyynnön runkoon tai kyselyparametriin upotettuihin todennustietoihin.jos palvelin ei edellyttäisi, että
POST
-rungossa olisi mediatyyppiContent-Type: application/json
, vaan sen sijaan hyväksyisiPOST
-rungon muodossaapplication/x-www-form-urlencoded
, jossa on parametri nimeltäjson
(tai mikä tahansa muu), jonka arvona on JSON-tieto.Miten korjata "Access-Control-Allow-Origin -otsikko ei saa olla jokerimerkki " -ongelmat**.
Mutta tämä on vain yksi esimerkki; muut (verkko)palvelinjärjestelmät tarjoavat samanlaisia tapoja alkuperäarvojen kaiuttamiseen.
Poista nämä rivit.
Access-Control-Allow-*
-otsikot ovat vastauksen otsikoita. Et koskaan halua lähettää niitä pyynnössä. Ainoa vaikutus, joka sillä on, on se, että se käynnistää selaimen tekemään preflightin.Tämä virhe ilmenee, kun asiakkaan URL-osoite ja palvelimen URL-osoite eivät täsmää, porttinumero mukaan lukien. Tässä tapauksessa sinun on otettava palvelussasi käyttöön CORS eli cross origin resource sharing.
Jos isännöit Spring REST -palvelua, löydät sen blogikirjoituksesta CORS-tuki Spring Frameworkissa.
Jos isännöit palvelua Node.js-palvelimella, niin sitten
Pysäytä Node.js-palvelin.
npm install cors --save
.Lisää seuraavat rivit server.js-tiedostoon
var cors = require('cors')
app.use(cors()) // Käytä tätä muuttujan ilmoittamisen jälkeen
Poista tämä: