AngularJS effectue une requête HTTP pour un cross-origin resource
Je suis en train de configuration AngularJS pour communiquer avec un cross-origin resource où l'actif de l'hôte qui offre mes fichiers de modèle se trouve sur un domaine différent et, par conséquent, la demande XHR qui angulaire effectue doit être inter-domaine. J'ai ajouté la appropriée de la SCRO en-tête de mon serveur la requête HTTP pour faire ce travail, mais il ne semble pas fonctionner. Le problème est que lorsque je passe en revue les requêtes HTTP dans mon navigateur (chrome) la demande adressée à l'actif du fichier est une des OPTIONS de demande (il devrait être d'une requête GET).
Je ne suis pas sûr de savoir si c'est un bug dans AngularJS ou si je dois configurer quelque chose. Ce que je comprends de la XHR wrapper peut pas en faire une des OPTIONS de requête HTTP, donc il semble que le navigateur est à essayer de comprendre si c'est "autorisé" à télécharger l'actif d'abord avant qu'il effectue la requête GET. Si c'est le cas, dois-je créer de la SCRO en-tête (Access-Control-Allow-Origin: http://asset.host...) à l'actif de l'hôte ainsi?
Vous devez vous connecter pour publier un commentaire.
OPTIONS de demande sont en aucun cas une AngularJS bug, c'est de cette façon Cross-Origin Resource sharing standard mandats navigateurs de se comporter. Veuillez vous référer à ce document: https://developer.mozilla.org/en-US/docs/HTTP_access_control, où, dans la section "Présentation" il dit:
Il est très difficile de proposer une solution générique qui pourrait fonctionner pour tous les serveurs WWW, comme le programme d'installation varie selon le serveur lui-même et les verbes HTTP que vous avez l'intention de les soutenir. Je vous invite à vous rendre sur cet excellent article (http://www.html5rocks.com/en/tutorials/cors/) qui a beaucoup plus de détails précis sur les en-têtes qui doit être envoyé par un serveur.
$resource
POST demande la génération d'un OPTIONS demande à mon backend ExpressJS serveur (sur le même hôte; mais d'un autre port).Angulaire 1.2.0rc1+, vous devez ajouter un resourceUrlWhitelist.
1.2: version ils ont ajouté une escapeForRegexp fonction de sorte que vous n'avez plus à échapper à la les chaînes. Vous pouvez simplement ajouter l'url directement
assurez-vous d'ajouter ** pour les sous-dossiers. Ici, c'est un travail jsbin pour 1.2:
http://jsbin.com/olavok/145/edit
1.2.0 rc: Si vous êtes toujours sur une version rc, l'angle 1.2.0rc1 la solution ressemble:
Ici est un jsbin exemple où il travaille pour la 1.2.0rc1:
http://jsbin.com/olavok/144/edit
Pré 1.2: Pour les versions plus anciennes (réf http://better-inter.net/enabling-cors-in-angular-js/), vous devez ajouter les 2 lignes suivantes à votre configuration:
Ici est un jsbin exemple où il travaille pour le pré 1.2 les différentes versions:
http://jsbin.com/olavok/11/edit
REMARQUE: Pas sûr qu'il fonctionne avec la dernière version de Anguleux.
ORIGINAL:
Il est également possible de remplacer les OPTIONS de demande (il n'a été testé dans google Chrome):
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Votre service doit répondre à un
OPTIONS
demande avec des en-têtes comme celles-ci:Ici est un bon doc: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
Le même document dit
Contrairement à une simple demande (voir ci-dessus), "contrôlé" demande d'envoyer d'abord un HTTP OPTIONS d'en-tête de demande de la ressource sur l'autre domaine, afin de déterminer si la demande est sûr d'envoyer. Les requêtes inter-domaines sont contrôlé comme cela, car ils peuvent avoir des implications pour les données de l'utilisateur. En particulier, une demande est contrôlé si:
Lors de la demande initiale est d'Obtenir sans en-têtes personnalisés, le navigateur ne doit pas faire des Options de demande de qui il le fait maintenant. Le problème est qu'il génère un en-tête X-Requested-Avec laquelle les forces de la demande Options. Voir https://github.com/angular/angular.js/pull/1454 sur la façon de supprimer cet en-tête
Cela a réglé mon problème:
Si vous utilisez un serveur nodeJS, vous pouvez utiliser cette bibliothèque, il a bien fonctionné pour moi https://github.com/expressjs/cors
et après vous pouvez faire une
npm update
.Voici comment j'ai résolu ce problème sur ASP.NET
Tout d'abord, vous devez ajouter le package nuget Microsoft.AspNet.WebApi.La scro
Puis modifier le fichier de App_Start\WebApiConfig.cs
Ajouter cet attribut sur votre contrôleur de classe
J'ai pu envoyer json à l'action, par ce moyen,
Référence :
L'activation de la Croix-Origine des Demandes en ASP.NET Web API 2
En quelque sorte je l'ai corrigé en changeant
à
Parfaitement décrit dans pkozlowski commentaire.
J'avais solution de travail avec AngularJS 1.2.6 et ASP.NET l'Api Web mais quand je l'eus mis à jour AngularJS pour 1.3.3 demande ensuite échoué.
Solution pour le Web Api serveur était d'ajouter le traitement des OPTIONS de demandes au début de la méthode de configuration (plus d'info dans ce blog):
Si vous utilisez Jersey pour le REPOS de l'API que vous pouvez faire comme ci-dessous
Vous n'avez pas à changer vos webservices mise en œuvre.
Je vais vous expliquer pour le Jersey 2.x
1) tout d'Abord ajouter un ResponseFilter comme indiqué ci-dessous
2) puis dans la web.xml dans le maillot de servlet déclaration ajouter le ci-dessous
J'ai renoncé à essayer de résoudre ce problème.
Mon web IIS.config avait " la
Access-Control-Allow-Methods
" en elle, j'ai testé l'ajout de paramètres de configuration pour mon Angulaire de code, mais après la combustion de quelques heures à essayer d'obtenir de Chrome à l'appel inter-domaine JSON web service, j'ai laissé tomber lamentablement.À la fin, j'ai ajouté un muet ASP.Net gestionnaire de la page web, obtenu que d'appeler mon JSON web service, et de retourner les résultats. Il a été opérationnel en 2 minutes.
Voici le code que j'ai utilisé:
Et dans mon Angulaire contrôleur...
Je suis sûr qu'il y a plus simple/plus générique façon de faire cela, mais la vie est trop courte...
Cela a fonctionné pour moi, et je peux obtenir sur avec faire travail normal maintenant !!
Pour un IIS MVC 5 /Angulaire de la CLI ( Oui, je suis bien conscient de votre problème est avec Angular JS ) projet de l'API, je n'ai suivantes:
web.config sous
<system.webServer>
nœudmondiale.asax.cs
Qui devrait résoudre votre problèmes pour les deux MVC et WebAPI sans avoir à faire tous les autres courir. Ensuite, j'ai créé un HttpInterceptor dans l'angle de la CLI projet qui est ajouté dans le pertinentes informations d'en-tête. Espérons que cela aide quelqu'un dans une situation similaire.
Peu en retard à la fête,
Si vous utilisez Angulaire 7 (ou 5/6/7) et PHP comme l'API, et toujours cette erreur, essayez de l'ajouter à la suite de l'en-tête des options pour le point de fin (PHP API).
Note : Ce qui ne nécessite est
Access-Control-Allow-Methods
. Mais, je suis coller ici deux autresAccess-Control-Allow-Origin
etAccess-Control-Allow-Headers
, tout simplement parce que vous aurez besoin de tous ces être correctement placé dans l'ordre Angulaire Application à bien parler à votre API.Espère que cela aide quelqu'un.
Acclamations.