Sono un novizio di angular.js, e sto cercando di aggiungere alcune intestazioni a una richiesta:Aggiunta di un'intestazione personalizzata a richiesta HTTP utilizzando angular.js
var config = {headers: {
'Authorization': 'Basic d2VudHdvcnRobWFuOkNoYW5nZV9tZQ==',
'Accept': 'application/json;odata=verbose'
}
};
$http.get('https://www.example.com/ApplicationData.svc/Malls(1)/Retailers', config).success(successCallback).error(errorCallback);
Ho guardato tutta la documentazione e mi sembra che dovrebbe essere corretto.
Quando uso un file locale per l'URL nella $http.get
, vedo la seguente richiesta HTTP della scheda di rete in Chrome:
GET /app/data/offers.json HTTP/1.1
Host: www.example.com
Connection: keep-alive
Cache-Control: max-age=0
If-None-Match: "0f0abc9026855b5938797878a03e6889"
Authorization: Basic Y2hhZHN0b25lbWFuOkNoYW5nZV9tZQ==
Accept: application/json;odata=verbose
X-Requested-With: XMLHttpRequest
If-Modified-Since: Sun, 24 Mar 2013 15:58:55 GMT
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
X-Testing: Testing
Referer: http://www.example.com/app/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Come si può vedere, sia delle intestazioni sono stati aggiunti correttamente. Ma quando cambio l'URL a quella mostrata nella $http.get
sopra (ad eccezione utilizzando l'indirizzo reale, non example.com), allora ottengo:
OPTIONS /ApplicationData.svc/Malls(1) HTTP/1.1
Host: www.datahost.net
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://mpon.site44.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
Access-Control-Request-Headers: accept, origin, x-requested-with, authorization, x-testing
Accept: */*
Referer: http://mpon.site44.com/app/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
L'unica differenza nel codice tra questi due è uno è per il primo l'URL è un file locale e per il secondo l'URL è un server remoto. Se si guarda la seconda intestazione della richiesta, non esiste un'intestazione di autenticazione e il Accept
sembra utilizzare un valore predefinito anziché quello specificato. Inoltre, la prima riga ora indica OPTIONS
anziché GET
(sebbene Access-Control-Request-Method
sia GET
).
Qualche idea di cosa non funziona nel codice precedente o di come includere le intestazioni aggiuntive quando non si utilizza un file locale come origine dati?
Questo appare come un problema CORS - prendere una lettura attraverso questa discussione per alcuni retroscena : https://groups.google.com/forum/#!topic/angular/CSBMY6oXfqs –
Si è trattato di un problema CORS. Il server non è stato configurato per restituire l'intestazione Access-Control-Allow-Origin :. Se vuoi scrivere una risposta con il tuo commento e un po 'di dettagli su CORS, accetterò la tua risposta. La risposta che segue di Dmitry Evseev e pubblicata da te era vicina, ma non il vero problema. – trentclowater
Chrome esegue il preflight della richiesta per cercare le intestazioni CORS se la richiesta è di dominio incrociato. Controlla la mia risposta. –