Sto ottenendo questo errore usando ngResource per chiamare un'API REST su Amazon Web Services:
XMLHttpRequest non può caricare
http://server.apiurl.com:8000/s/login?login=facebook. La risposta alla richiesta di preflight doesn't passare il controllo di accesso: No 'Access-Control-Allow-Origin' header è presente sulla risorsa. L'origine 'http://localhost' non è quindi permesso l'accesso. Errore 405.
Servizio:
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'}
});
}]);
Controllore:
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
Sto usando Chrome, e non so cos'altro fare per risolvere questo problema. Ho anche configurato il server per accettare intestazioni dall'origine localhost
.
State incontrando problemi di CORS.
Ci sono diversi modi per risolvere questo problema.
Più verbosamente, stai cercando di accedere a api.serverurl.com da localhost. Questa è l'esatta definizione di richiesta di dominio incrociato.
Spegnendolo solo per portare a termine il tuo lavoro (OK, metti poca sicurezza per te se visiti altri siti e calcia solo il barattolo lungo la strada) puoi usare un proxy che fa pensare al tuo browser che tutte le richieste provengano dall'host locale quando in realtà hai un server locale che poi chiama il server remoto.
Così api.serverurl.com potrebbe diventare localhost:8000/api e il vostro nginx locale o altro proxy invierà alla destinazione corretta.
Ora a grande richiesta, 100% più informazioni CORS....stesso grande gusto!
E per i downvoters.... bypassare CORS è esattamente ciò che viene mostrato per chi sta semplicemente imparando il front end. https://codecraft.tv/courses/angular/http/http-with-promises/
Il mio "API Server" è un'applicazione PHP quindi per risolvere questo problema ho trovato la seguente soluzione che funziona:
Mettere le linee in index.php
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');
Per il server python flask, potete usare il plugin flask-cors per abilitare le richieste cross domain.