J'essaie de configurer AngularJS pour communiquer avec une ressource d'origine croisée où l'hôte d'actif qui fournit mes fichiers de modèle se trouve sur un domaine différent et, par conséquent, la demande XHR que Angular effectue doit être inter-domaine. J'ai ajouté l'en-tête CORS approprié à mon serveur pour la demande HTTP pour que cela fonctionne, mais cela ne semble pas fonctionner. Le problème est que lorsque j'inspecte les requêtes HTTP dans mon navigateur (chrome), la requête envoyée au fichier d'actif est une requête OPTIONS (il doit s'agir d'une requête GET).
Je ne sais pas s'il s'agit d'un bogue dans AngularJS ou si j'ai besoin de configurer quelque chose. D'après ce que je comprends, l'encapsuleur XHR ne peut pas faire de requête HTTP OPTIONS, il semble donc que le navigateur essaie de déterminer s'il est "autorisé" à télécharger l'actif en premier avant d'exécuter la demande GET. Si tel est le cas, dois-je également définir l'en-tête CORS (Access-Control-Allow-Origin: http://asset.host ... ) Avec l'hôte d'actif?
la source
$resource
POST AngularJS génère une demande OPTIONS vers mon serveur ExpressJS backend (sur le même hôte, mais un port différent).Pour Angular 1.2.0rc1 +, vous devez ajouter une ressourceUrlWhitelist.
1.2: version de sortie, ils ont ajouté une fonction escapeForRegexp afin que vous n'ayez plus à échapper aux chaînes. Vous pouvez simplement ajouter l'URL directement
assurez-vous d'ajouter ** pour les sous-dossiers. Voici un jsbin fonctionnel pour 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: Si vous êtes toujours sur une version rc, le Angular 1.2.0rc1 ressemble à la solution:
Voici un exemple jsbin où cela fonctionne pour 1.2.0rc1: http://jsbin.com/olavok/144/edit
Pré 1.2: Pour les versions plus anciennes (ref http://better-inter.net/enabling-cors-in-angular-js/ ) vous devez ajouter les 2 lignes suivantes à votre configuration:
Voici un exemple jsbin où cela fonctionne pour les versions antérieures à 1.2: http://jsbin.com/olavok/11/edit
la source
REMARQUE: je ne suis pas sûr que cela fonctionne avec la dernière version d'Angular.
ORIGINAL:
Il est également possible de remplacer la demande OPTIONS (n'a été testé que dans Chrome):
la source
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Votre service doit répondre à une
OPTIONS
demande avec des en-têtes comme ceux-ci:Voici un bon doc: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
la source
Le même document dit
Contrairement aux demandes simples (décrites ci-dessus), les demandes "de contrôle en amont" envoient d'abord un en-tête de demande HTTP OPTIONS à la ressource de l'autre domaine, afin de déterminer si la demande réelle peut être envoyée en toute sécurité. Les demandes intersites sont contrôlées en amont comme ceci car elles peuvent avoir des implications sur les données des utilisateurs. En particulier, une demande est contrôlée en amont si:
Lorsque la demande d'origine est Get sans en-têtes personnalisés, le navigateur ne doit pas faire de demande d'options comme il le fait maintenant. Le problème est qu'il génère un en-tête X-Requested-With qui force la requête Options. Voir https://github.com/angular/angular.js/pull/1454 sur la façon de supprimer cet en-tête
la source
Cela a résolu mon problème:
la source
Si vous utilisez un serveur nodeJS, vous pouvez utiliser cette bibliothèque, cela a bien fonctionné pour moi https://github.com/expressjs/cors
et après vous pouvez faire un
npm update
.la source
Voici comment j'ai résolu ce problème sur ASP.NET
Tout d'abord, vous devez ajouter le package de nuget Microsoft.AspNet.WebApi.Cors
Modifiez ensuite le fichier App_Start \ WebApiConfig.cs
Ajoutez cet attribut à votre classe de contrôleur
J'ai pu envoyer json à l'action de cette façon
Référence: activation des requêtes d'origine croisée dans l'API Web ASP.NET 2
la source
D'une certaine manière, je l'ai corrigé en changeant
à
la source
Parfaitement décrit dans le commentaire de pkozlowski. J'avais une solution de travail avec AngularJS 1.2.6 et ASP.NET Web Api mais quand j'ai mis à niveau AngularJS vers 1.3.3, les demandes ont échoué.
La solution pour le serveur Web Api consistait à ajouter la gestion des requêtes OPTIONS au début de la méthode de configuration (plus d'informations dans cet article de blog ):
la source
Si vous utilisez Jersey pour les API REST, vous pouvez procéder comme ci-dessous
Vous n'avez pas à modifier votre implémentation de services Web.
Je vais vous expliquer pour Jersey 2.x
1) Ajoutez d'abord un ResponseFilter comme indiqué ci-dessous
2) puis dans le web.xml, dans la déclaration du jersey servlet, ajoutez ce qui suit
la source
J'ai renoncé à essayer de résoudre ce problème.
Mon web.config IIS avait le "
Access-Control-Allow-Methods
" , j'ai expérimenté l'ajout de paramètres de configuration à mon code angulaire, mais après avoir brûlé quelques heures en essayant de faire appeler Chrome un service Web JSON interdomaine, j'ai abandonné misérablement.À la fin, j'ai ajouté une page Web de gestionnaire ASP.Net stupide, cela pour appeler mon service Web JSON et renvoyer les résultats. Il était opérationnel en 2 minutes.
Voici le code que j'ai utilisé:
Et dans mon contrôleur angulaire ...
Je suis sûr qu'il existe un moyen plus simple / plus générique de le faire, mais la vie est trop courte ...
Cela a fonctionné pour moi et je peux maintenant faire un travail normal !!
la source
Pour un projet IIS MVC 5 / Angular CLI (Oui, je suis bien conscient que votre problème est lié à Angular JS) avec l'API, j'ai fait ce qui suit:
web.config sous le
<system.webServer>
noeudglobal.asax.cs
Cela devrait résoudre vos problèmes pour MVC et WebAPI sans avoir à faire tout le reste. J'ai ensuite créé un HttpInterceptor dans le projet CLI angulaire qui a automatiquement ajouté les informations d'en-tête pertinentes. J'espère que cela aide quelqu'un dans une situation similaire.
la source
Un peu tard pour la fête,
Si vous utilisez Angular 7 (ou 5/6/7) et PHP comme API et que vous obtenez toujours cette erreur, essayez d'ajouter les options d'en-tête suivantes au point final (API PHP).
Remarque : ce qui nécessite uniquement, c'est
Access-Control-Allow-Methods
. Mais, je colle ici deux autresAccess-Control-Allow-Origin
etAccess-Control-Allow-Headers
, simplement parce que vous aurez besoin de tout cela pour être correctement configuré afin que Angular App puisse parler correctement à votre API.J'espère que cela aide quelqu'un.
À votre santé.
la source