Mod-Hinweis : Bei dieser Frage geht es darum, warum Postman nicht wie eine XMLHttpRequest CORS-Einschränkungen unterliegt. In dieser Frage geht es nicht darum, wie ein Fehler "Nein 'Zugriffskontrolle-Zulassen-Ursprung' ..." behoben werden kann.
Bitte hör auf zu posten :
- CORS-Konfigurationen für jede Sprache / jedes Framework unter der Sonne. Finden Sie stattdessen die Frage Ihrer relevanten Sprache / Ihres Frameworks .
- Dienste von Drittanbietern, die eine Anforderung zur Umgehung von CORS ermöglichen
- Befehlszeilenoptionen zum Deaktivieren von CORS für verschiedene Browser
Ich versuche, die Autorisierung mithilfe von JavaScript durchzuführen, indem ich eine Verbindung zum integrierten RESTful- API - Flask herstelle . Wenn ich jedoch die Anfrage stelle, wird folgende Fehlermeldung angezeigt:
XMLHttpRequest kann http: // myApiUrl / login nicht laden . In der angeforderten Ressource ist kein Header 'Access-Control-Allow-Origin' vorhanden. Origin 'null' ist daher kein Zugriff gestattet.
Ich weiß, dass die API oder die Remote-Ressource den Header festlegen muss, aber warum hat es funktioniert, als ich die Anfrage über die Chrome-Erweiterung Postman gestellt habe ?
Dies ist der Anforderungscode:
$.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);
});
quelle
Antworten:
Wenn ich es richtig verstanden habe, führen Sie eine XMLHttpRequest für eine andere Domain durch, auf der sich Ihre Seite befindet. Der Browser blockiert es also, da er aus Sicherheitsgründen normalerweise eine Anfrage desselben Ursprungs zulässt. Sie müssen etwas anderes tun, wenn Sie eine domänenübergreifende Anfrage stellen möchten. Ein Tutorial, wie dies erreicht werden kann, ist die Verwendung von CORS .
Wenn Sie Postboten verwenden, sind diese nicht durch diese Richtlinie eingeschränkt. Zitiert aus Cross-Origin XMLHttpRequest :
quelle
Es ist sehr einfach zu lösen, wenn Sie PHP verwenden . Fügen Sie einfach das folgende Skript am Anfang Ihrer PHP-Seite hinzu, das die Anfrage bearbeitet:
Wenn Sie Node-Red verwenden , müssen Sie CORS in der
node-red/settings.js
Datei zulassen, indem Sie die folgenden Zeilen auskommentieren:Wenn Sie Flask wie in der Frage verwenden; Sie müssen zuerst installieren
flask-cors
Nehmen Sie dann die Kolbenkors in Ihre Anwendung auf.
Eine einfache Anwendung sieht folgendermaßen aus:
Weitere Informationen finden Sie in der Kolbendokumentation .
quelle
Weil
$ .ajax ({Typ: "POST" - ruft OPTIONS
$ .post auf ( - ruft POST auf
Beide sind unterschiedlich. Der Postbote ruft "POST" richtig auf, aber wenn wir es nennen, wird es "OPTIONEN" sein.
Für C # -Webdienste - Web-API
Bitte fügen Sie den folgenden Code in Ihre web.config- Datei unter dem Tag <system.webServer> ein. Das wird funktionieren:
Bitte stellen Sie sicher, dass Sie beim Ajax-Anruf keinen Fehler machen
jQuery
Hinweis: Wenn Sie zum Herunterladen von Inhalten suchen aus einer Drittanbieter - Website dann wird dies Ihnen nicht helfen . Sie können den folgenden Code ausprobieren, jedoch nicht JavaScript.
quelle
*
benutzenhttps://www.myotherdomain.com
Das Anwenden einer CORS-Einschränkung ist eine Sicherheitsfunktion, die von einem Server definiert und von einem Browser implementiert wird .
Das Postman-Tool kümmert sich jedoch nicht um die CORS-Richtlinie des Servers.
Aus diesem Grund wird der CORS-Fehler im Browser angezeigt, nicht jedoch in Postman.
quelle
In der folgenden Untersuchung als API verwende ich http://example.com anstelle von http: // myApiUrl / login aus Ihrer Frage, da diese erste funktioniert.
Ich gehe davon aus, dass sich Ihre Seite unter http: //my-site.local: 8088 befindet .
Der Grund, warum Sie unterschiedliche Ergebnisse sehen, ist, dass Postbote:
Host=example.com
(Ihre API)Origin
Dies ähnelt der Art und Weise, wie Browser Anforderungen senden, wenn die Site und die API dieselbe Domäne haben (Browser legen auch das Header-Element fest
Referer=http://my-site.local:8088
, ich sehe es jedoch nicht in Postman). Wenn derOrigin
Header nicht festgelegt ist, lassen Server solche Anforderungen normalerweise standardmäßig zu.Dies ist die Standardmethode, mit der Postman Anfragen sendet. Ein Browser sendet Anforderungen jedoch anders, wenn Ihre Site und API unterschiedliche Domänen haben. Dann tritt CORS auf und der Browser automatisch:
Host=example.com
(Ihren als API)Origin=http://my-site.local:8088
(Ihre Site)(Der Header
Referer
hat den gleichen Wert wieOrigin
). Und jetzt sehen Sie auf der Registerkarte " Konsole und Netzwerke" von Chrome Folgendes :Wenn
Host != Origin
dies CORS ist und der Server eine solche Anforderung erkennt, blockiert er diese normalerweise standardmäßig .Origin=null
wird festgelegt, wenn Sie HTML-Inhalte aus einem lokalen Verzeichnis öffnen und eine Anforderung senden. Die gleiche Situation ist, wenn Sie eine Anfrage innerhalb eines senden<iframe>
, wie im folgenden Snippet (aber hier ist derHost
Header überhaupt nicht gesetzt) - im Allgemeinen können Sie dies überall dort übersetzen, wo die HTML-Spezifikation undurchsichtigen Ursprung sagtOrigin=null
. Weitere Informationen hierzu finden Sie hier .Wenn Sie keine einfache CORS-Anfrage verwenden, sendet der Browser normalerweise automatisch auch eine OPTIONS-Anfrage, bevor Sie die Hauptanforderung senden. Weitere Informationen finden Sie hier . Das folgende Snippet zeigt es:
Sie können die Konfiguration Ihres Servers ändern, um CORS-Anforderungen zuzulassen.
Hier ist eine Beispielkonfiguration, die CORS unter nginx aktiviert (Datei nginx.conf). Seien Sie sehr vorsichtig bei der Einstellung
always/"$http_origin"
für nginx und"*"
Apache. Dadurch wird CORS von jeder Domäne entsperrt.Code-Snippet anzeigen
Hier ist eine Beispielkonfiguration, die CORS in Apache aktiviert (.htaccess-Datei)
Code-Snippet anzeigen
quelle
In verschiedenen Anwendungsfällen ist derselbe Fehler aufgetreten.
Anwendungsfall: In Chrom, wenn versucht wird, den Spring REST- Endpunkt im Winkel aufzurufen .
Lösung: Fügen Sie die Annotation @CrossOrigin ("*") über der jeweiligen Controller-Klasse hinzu.
quelle
Wenn Sie .NET als mittlere Ebene verwenden, überprüfen Sie das Routenattribut deutlich, z.
Ich hatte ein Problem, als es so war,
Es wurde dadurch behoben,
quelle
Fügen Sie nur für .NET Core Web API-Projekte folgende Änderungen hinzu:
services.AddMvc()
Zeile in derConfigureServices()
Methode der Datei Startup.cs den folgenden Code ein :app.UseMvc()
Zeile in dieConfigure()
Methode der Datei Startup.cs ein:quelle