Ich bekomme diesen Fehler mit ngResource, um eine REST-API auf Amazon Web Services aufrufen:
XMLHttpRequest kann nicht geladen werden http://server.apiurl.com:8000/s/login?login=facebook. Antwort auf Preflight-Anfrage besteht die Zugriffskontrollprüfung nicht: Nein 'Access-Control-Allow-Origin' Header ist auf der angeforderten Ressource vorhanden. Herkunft 'http://localhost' ist daher nicht erlaubt Zugriff. Fehler 405
Dienst:
socialMarkt.factory('loginService', ['$resource', function($resource){
var apiAddress = "http://server.apiurl.com:8000/s/login/";
return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
getUser: {method:'POST'}
});
}]);
Controller:
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
Ich benutze Chrome, und ich weiß nicht, was ich sonst noch tun kann, um dieses Problem zu beheben. Ich habe sogar den Server so konfiguriert, dass er Header von der Herkunft "localhost" akzeptiert.
Sie stoßen auf CORS-Probleme.
Es gibt mehrere Möglichkeiten, dies zu beheben/umzugehen.
Umständlicher ausgedrückt: Sie versuchen, von localhost aus auf api.serverurl.com zuzugreifen. Dies ist die genaue Definition einer domänenübergreifenden Anfrage.
Indem Sie es entweder ausschalten, nur um Ihre Arbeit zu erledigen (OK, das bedeutet schlechte Sicherheit für Sie, wenn Sie andere Websites besuchen, und es ist nur ein Tropfen auf den heißen Stein), können Sie einen Proxy verwenden, der Ihren Browser glauben lässt, dass alle Anfragen vom lokalen Host kommen, während Sie in Wirklichkeit einen lokalen Server haben, der dann den entfernten Server aufruft.
So kann api.serverurl.com zu localhost:8000/api werden und Ihr lokaler nginx oder ein anderer Proxy sendet an das richtige Ziel.
Auf vielfachen Wunsch gibt es jetzt 100% mehr CORS-Informationen....dasselbe tolle Angebot!
Und für die Downvoters.... ist die Umgehung von CORS genau das, was denjenigen gezeigt wird, die das Frontend einfach nur lernen. https://codecraft.tv/courses/angular/http/http-with-promises/
Meine "API Server" ist eine PHP-Anwendung, so dass dieses Problem zu lösen, fand ich die unten Lösung zu arbeiten:
Fügen Sie die folgenden Zeilen in index.php ein
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
Für den Python-Flask-Server können Sie das Plugin flask-cors verwenden, um domänenübergreifende Anfragen zu ermöglichen.