Bandau atlikti autorizaciją naudodamas JavaScript, jungdamasis prie RESTful API, integruotos į Flask. Tačiau kai pateikiu užklausą, gaunu tokią klaidą:
XMLHttpRequest negali įkelti http://myApiUrl/login. Nėra 'Access-Control-Allow-Origin' antraštės prašomame išteklyje. Todėl prieiga prie origin 'null' neleidžiama.
Žinau, kad API arba nutolęs išteklius turi nustatyti antraštę, bet kodėl ji veikė, kai užklausą pateikiau per "Chrome" plėtinį Postman?
Tai yra užklausos kodas:
$.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);
});
Jei teisingai supratau, jūs atliekate XMLHttpRequest į kitą domeną nei jūsų puslapis. Taigi naršyklė ją blokuoja, nes paprastai saugumo sumetimais ji leidžia pateikti tos pačios kilmės užklausą. Kai norite atlikti tarpdomeninę užklausą, turite daryti ką nors kita. Kaip tai padaryti, rasite Naudojant CORS.
Kai naudojate postman, ši politika jų neriboja. Citata iš Cross-Origin XMLHttpRequest:
Įprasti tinklalapiai gali naudoti XMLHttpRequest objektą duomenims iš nutolusių serverių siųsti ir gauti, tačiau juos riboja ta pati kilmės politika. Išplėtimai nėra tokie riboti. Išplėtimas gali bendrauti su nutolusiais serveriais, esančiais už jo kilmės vietos ribų, jei prieš tai paprašo kryžminio kilmės leidimo.
Jei galite susidoroti su JSON, tada pabandykite naudoti JSONP (atkreipkite dėmesį į P pabaigoje), kad galėtumėte kalbėti tarp domenų:
$.ajax({
type: "POST",
dataType: 'jsonp',
...... etc ......
Sužinokite daugiau apie darbą su JSONP čia: JSONP - iš esmės sutartinis tarp svetainių skriptų įsilaužimas - atvėrė duris galingiems turinio mišiniams. Daugelis žymių svetainių teikia JSONP paslaugas, suteikiančias prieigą prie jų turinio per iš anksto nustatytą API.
Naudojant "Ajax" susiduriama su tarpdomeno problema. Turite būti tikri, kad failus pasiekiate tuo pačiu http://
keliu be www.
(arba pasiekiate iš http://www.
ir siunčiate į tą patį kelią, įskaitant www.
), kurį naršyklė laiko kitu domenu, kai pasiekia per www.
kelią, todėl matote, kur yra problema. Jūs rašote į kitą domeną, o naršyklė blokuoja srautą dėl kilmės problemos.
Jei API nėra patalpinta tame pačiame prieglobstyje, iš kurio siunčiate užklausą, srautas blokuojamas ir jums reikės rasti kitą būdą bendrauti su API.