Hvorfor får JavaScript-koden min en "No 'Access-Control-Allow-Origin ' header is present on the requested resource " feil når Postman ikke gjør det?
Jeg prøver å autorisere ved hjelp av JavaScript ved å koble til RESTful API innebygd i Flask. Når jeg sender forespørselen, får jeg imidlertid følgende feil:
XMLHttpRequest kan ikke laste http://myApiUrl/login. Ingen 'Access-Control-Allow-Origin' header er til stede på den forespurte ressursen. Origin 'null' er derfor ikke tillatt tilgang.
Jeg vet at API-et eller den eksterne ressursen må angi overskriften, men hvorfor fungerte det da jeg sendte forespørselen via Chrome-utvidelsen Postman?
Dette er forespørselskoden:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
2309
3
Hvis jeg har forstått det riktig, sender du en XMLHttpRequest til et annet domene enn siden din ligger på. Nettleseren blokkerer den, ettersom den vanligvis tillater en forespørsel med samme opprinnelse av sikkerhetsgrunner. Du må gjøre noe annet når du vil sende en forespørsel på tvers av domener. En veiledning om hvordan du gjør det er Bruke CORS.
Når du bruker Postman, er de ikke begrenset av disse retningslinjene. Sitert fra Cross-Origin XMLHttpRequest:
Vanlige nettsider kan bruke XMLHttpRequest-objektet til å sende og motta data fra eksterne servere, men de er begrenset av de samme retningslinjene for opprinnelse. Utvidelser er ikke så begrenset. En utvidelse kan snakke med eksterne servere utenfor sin opprinnelse, så lenge den først ber om tillatelser på tvers av opprinnelse.
Hvis du kan håndtere JSON i retur, kan du prøve å bruke JSONP (merk P på slutten) for å snakke mellom domener:
Lær mer om hvordan du arbeider med JSONP her:
Det er et problem på tvers av domener ved bruk av Ajax. Du må være sikker på at du har tilgang til filene dine på samme
http://
-bane utenwww.
(eller tilgang frahttp://www.
og post til samme bane inkludertwww.
) som nettleseren anser som et annet domene når du får tilgang via enwww.
-bane, slik at du ser hvor problemet er. Du poster til et annet domene, og nettleseren blokkerer flyten på grunn av opprinnelsesproblemet.Hvis API ikke er plassert på samme vert som du forespør fra, blokkeres flyten, og du må finne en annen måte å kommunisere med API-et på.