Ich hatte eine PhoneGap-App entwickelt, die jetzt in eine mobile Website umgewandelt wird. Bis auf einen kleinen Fehler funktioniert alles reibungslos. Ich verwende eine bestimmte Drittanbieter-API über eine POST-Anfrage, die in der App einwandfrei funktioniert, in der Version der mobilen Website jedoch fehlschlägt.
Bei näherer Betrachtung scheint AngularJS (ich denke, der Browser tatsächlich) zuerst eine OPTIONS-Anfrage zu senden. Ich habe heute viel über CORS gelernt, aber ich kann anscheinend nicht herausfinden, wie ich es insgesamt deaktivieren kann. Ich habe keinen Zugriff auf diese API (daher sind Änderungen auf dieser Seite nicht möglich), aber sie haben die Domäne, an der ich arbeite, zu ihrem Access-Control-Allow-Origin-Header hinzugefügt.
Dies ist der Code, über den ich spreche:
var request = {
language: 'fr',
barcodes: [
{
barcode: 'somebarcode',
description: 'Description goes here'
}
]
};
}
var config = {
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/json'
}
};
$http.post('http://somedomain.be/trackinginfo', request, config).success(function(data, status) {
callback(undefined, data);
}).error(function(data, status) {
var err = new Error('Error message');
err.status = status;
callback(err);
});
Wie kann ich verhindern, dass der Browser (oder AngularJS) diese OPTIONS-Anforderung sendet, und einfach zur eigentlichen POST-Anforderung springen? Ich benutze AngularJS 1.2.0.
Danke im Voraus.
Wie Ray sagte, können Sie es stoppen, indem Sie den Content-Header wie folgt ändern:
Zum Beispiel -
Oder direkt zu einem Anruf -
Dies sendet keine Anfrage für eine Option vor dem Flug.
HINWEIS: Die Anforderung sollte keinen benutzerdefinierten Header-Parameter haben. Wenn der Anforderungsheader einen benutzerdefinierten Header enthält, stellt der Browser eine Anforderung vor dem Flug. Sie können dies nicht vermeiden.
quelle
$http
?GET
und ein zusätzlicher HeaderAuthorization
. Aber immer noch den Preflight senden.Ich denke, der beste Weg ist zu überprüfen, ob die Anfrage vom Typ "OPTIONEN" ist und 200 von der mittleren Ware zurückgibt. Es hat bei mir funktioniert.
quelle
Bei der Ausführung bestimmter Arten von domänenübergreifenden AJAX-Anforderungen fügen moderne Browser, die CORS unterstützen, eine zusätzliche "Preflight" -Anforderung ein, um festzustellen, ob sie über die Berechtigung zum Ausführen der Aktion verfügen. Aus Beispielabfrage:
Als Ergebnis dieses Fragments können wir sehen, dass der Adresse zwei Anforderungen gesendet wurden (OPTIONS und GET). Die Antwort vom Server enthält Header, die die Zulässigkeit der Abfrage GET bestätigen. Wenn Ihr Server nicht für die ordnungsgemäße Verarbeitung einer OPTIONS-Anforderung konfiguriert ist, schlagen Clientanforderungen fehl. Beispielsweise:
quelle
Preflight ist eine vom Browser implementierte Web-Sicherheitsfunktion. Für Chrome können Sie die gesamte Websicherheit deaktivieren, indem Sie das Flag --disable-web-security hinzufügen.
Beispiel: "C: \ Programme \ Google \ Chrome \ Application \ chrome.exe" --disable-web-security --user-data-dir = "C: \ newChromeSettingsWithoutSecurity". Sie können zuerst eine neue Verknüpfung für Chrom erstellen, zu den Eigenschaften wechseln und das Ziel wie oben ändern. Das sollte helfen!
quelle
Wenn Sie den Inhaltstyp auf undefiniert setzen, werden die Header-Daten so wie sie sind von Javascript übergeben und die standardmäßigen eckigen $ httpProvider-Header-Konfigurationen überschrieben. Angular $ http-Dokumentation
quelle