Ich bin ein Anfänger von angular.js und versuche, einer Anfrage einige Header hinzuzufügen:
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);
Ich habe mir die gesamte Dokumentation angesehen, und dies scheint mir richtig zu sein.
Wenn ich eine lokale Datei für die URL in der verwende $http.get
, wird auf der Registerkarte "Netzwerk" in Chrome die folgende HTTP-Anforderung angezeigt:
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
Wie Sie sehen können, wurden beide Header korrekt hinzugefügt. Aber wenn ich die URL in die $http.get
oben gezeigte ändere (außer unter Verwendung der realen Adresse, nicht example.com), erhalte ich:
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
Der einzige Unterschied im Code zwischen diesen beiden besteht darin, dass zum einen die URL eine lokale Datei und zum anderen ein Remote-Server ist. Wenn Sie sich den zweiten Anforderungsheader ansehen, gibt es keinen Authentifizierungsheader, und der verwendet Accept
anscheinend einen Standard anstelle des angegebenen. Auch in der ersten Zeile steht jetzt OPTIONS
statt GET
(obwohl Access-Control-Request-Method
ist GET
).
Haben Sie eine Idee, was mit dem obigen Code nicht stimmt oder wie Sie die zusätzlichen Header einbinden können, wenn Sie keine lokale Datei als Datenquelle verwenden?
quelle
Antworten:
Ich nahm, was Sie hatten, und fügte einen weiteren
X-Testing
Header hinzuAuf der Registerkarte "Chrome-Netzwerk" werden sie gesendet.
Sehen Sie sie nicht im Browser oder auf dem Server? Probieren Sie das Browser-Tool oder einen Debug-Proxy aus und sehen Sie, was gesendet wird.
quelle
Grundlegende Authentifizierung mithilfe der HTTP-POST-Methode:
... und GET-Methodenaufruf mit Header:
quelle
Wenn Sie Ihre benutzerdefinierten Header zu ALLEN Anforderungen hinzufügen möchten, können Sie die Standardeinstellungen für $ httpProvider ändern, um diesen Header immer hinzuzufügen.
quelle
Mein Vorschlag ist, eine Funktionsaufrufeinstellung wie diese in die Funktion einzufügen und den dafür geeigneten Header zu überprüfen. Ich bin sicher, es wird definitiv funktionieren. es funktioniert perfekt für mich.
Rufen Sie dann Ihre Daten so auf
quelle
Was Sie für die OPTIONS-Anfrage sehen, ist in Ordnung. Autorisierungsheader werden darin nicht angezeigt.
Damit die grundlegende Authentifizierung funktioniert, müssen Sie Folgendes hinzufügen:
withCredentials = true;
zu Ihremvar config
.Aus der AngularJS $ http-Dokumentation :
quelle
Und wie lautet die Antwort vom Server? Es sollte eine 204 antworten und dann wirklich das GET senden, das Sie anfordern.
In den OPTIONEN prüft der Client, ob der Server CORS-Anforderungen zulässt. Wenn Sie etwas anderes als einen 204 erhalten, sollten Sie Ihren Server so konfigurieren, dass die richtigen Allow-Origin-Header gesendet werden.
Die Art und Weise, wie Sie Header hinzufügen, ist die richtige Vorgehensweise.
quelle
Chrome prüft vorab die Anfrage, nach CORS-Headern zu suchen. Wenn die Anfrage akzeptabel ist, wird die eigentliche Anfrage gesendet. Wenn Sie diese domänenübergreifende Aktion ausführen, müssen Sie sich lediglich damit befassen oder einen Weg finden, die Anfrage nicht domänenübergreifend zu gestalten. Dies ist beabsichtigt.
Ref: AJAX in Chrome sendet OPTIONEN anstelle von GET / POST / PUT / DELETE?
quelle
Für mich hat das folgende erklärende Snippet funktioniert. Vielleicht sollten Sie nicht
'
für den Headernamen verwenden?Ich benutze
$http.ajax()
, obwohl ich nicht erwarten würde, dass dies ein Game Changer ist.quelle