J’obtiens cette erreur en utilisant ngResource pour appeler une API REST sur Amazon Web Services :
XMLHttpRequest ne peut pas charger http://server.apiurl.com:8000/s/login?login=facebook. La réponse à preflight request doesn't pass access control check : Non 'Access-Control-Allow-Origin' ; header is present on the requested ressource demandée. L'origine 'http://localhost' ; n'est donc pas autorisée à accéder. Erreur 405
Service :
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'}
});
}]);
Contrôleur :
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
J'utilise Chrome, et je ne sais pas quoi faire d'autre pour résoudre ce problème. J'ai même configuré le serveur pour qu'il accepte les en-têtes provenant de l'origine localhost
.
Vous rencontrez des problèmes de CORS.
Il existe plusieurs façons de résoudre ce problème.
Plus précisément, vous essayez d'accéder à api.serverurl.com depuis localhost. C'est la définition exacte d'une requête inter-domaine.
Vous pouvez soit le désactiver pour que votre travail soit fait (OK, la sécurité est médiocre pour vous si vous visitez d'autres sites et cela ne fait qu'empirer les choses), soit utiliser un proxy qui fait croire à votre navigateur que toutes les requêtes proviennent de l'hôte local alors qu'en réalité vous avez un serveur local qui appelle ensuite le serveur distant.
Ainsi, api.serverurl.com peut devenir localhost:8000/api et votre nginx ou autre proxy local enverra la requête à la bonne destination.
Maintenant, à la demande générale, [100% plus d'infos CORS][3]....same great taste !
Et pour ceux qui ont voté contre.... contournement de CORS est exactement ce qui est montré pour ceux qui apprennent simplement le front-end. https://codecraft.tv/courses/angular/http/http-with-promises/
[1] : https://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome [2] : http://oskarhane.com/avoid-cors-with-nginx-proxy_pass/ [3] : https://www.w3.org/wiki/CORS_Enabled "!00% plus d'infos sur CORS" ;
Mon serveur API est une application PHP. Pour résoudre ce problème, j'ai trouvé la solution ci-dessous qui fonctionne :
Placez les lignes dans 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');
Pour le serveur python flask, vous pouvez utiliser le plugin flask-cors pour activer les requêtes inter-domaines.