J'ai une machine sur mon réseau local (machineA) qui a deux serveurs Web. Le premier est celui intégré dans XBMC (sur le port 8080) et affiche notre bibliothèque. Le deuxième serveur est un script python CherryPy (port 8081) que j'utilise pour déclencher une conversion de fichier à la demande. La conversion du fichier est déclenchée par une requête AJAX POST à partir de la page servie depuis le serveur XBMC.
- Aller à http: // machineA: 8080 qui affiche la bibliothèque
- La bibliothèque est affichée
- L'utilisateur clique sur le lien «convertir» qui émet la commande suivante -
jQuery Ajax Request
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- Le navigateur émet une requête HTTP OPTIONS avec les en-têtes suivants;
En-tête de demande - OPTIONS
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
- Le serveur répond par ce qui suit:
En-tête de réponse - OPTIONS (STATUT = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
- La conversation s'arrête alors. Le navigateur devrait, en théorie, émettre une requête POST car le serveur a répondu avec les en-têtes CORS corrects (?) (Access-Control-Allow-Origin: *)
Pour le dépannage, j'ai également émis la même commande $ .post depuis http://jquery.com . C'est là que je suis perplexe, de jquery.com, la demande de publication fonctionne, une demande d'OPTIONS est envoyée par la suite par un POST. Les en-têtes de cette transaction sont ci-dessous;
En-tête de demande - OPTIONS
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://jquery.com
Access-Control-Request-Method: POST
En-tête de réponse - OPTIONS (STATUT = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
En-tête de demande - POST
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache
En-tête de réponse - POST (STATUS = 200 OK)
Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json
Je ne peux pas comprendre pourquoi la même demande fonctionnerait à partir d'un site, mais pas de l'autre. J'espère que quelqu'un pourrait indiquer ce qui me manque. Merci de votre aide!
Réponses:
Je suis finalement tombé sur ce lien " Une requête CORS POST fonctionne à partir de javascript ordinaire, mais pourquoi pas avec jQuery? " Qui note que jQuery 1.5.1 ajoute le
en-tête à toutes les demandes CORS. jQuery 1.5.2 ne fait pas cela. En outre, selon la même question, définir un en-tête de réponse du serveur de
ne permet pas à la réponse de continuer. Vous devez vous assurer que l'en-tête de réponse inclut spécifiquement les en-têtes requis. c'est à dire:
la source
DEMANDE:
RÉPONSE:
la source
J'ai résolu mon propre problème lors de l'utilisation de l'API google distance matrix en définissant mon en-tête de demande avec Jquery ajax. jetez un œil ci-dessous.
Notez ce que j'ai ajouté dans les paramètres
**
**
J'espère que cela aide.
la source
Cela m'a pris un peu de temps pour trouver la solution.
Si votre serveur répond correctement et que la demande pose problème, vous devez ajouter
withCredentials: true
à laxhrFields
dans la demande:la source
withCredentials: true
? vous êtes sûr d'avoir les en-têtes appropriés?,
jquery version: 3.2.1`. En fait, il fonctionne via le facteur, mais il ne passe pas par le navigateur ChromeEh bien, j'ai eu du mal avec ce problème pendant quelques semaines.
Le moyen le plus simple, le plus conforme et le moins hacky de le faire est probablement d'utiliser une API JavaScript du fournisseur qui ne fait pas d'appels par navigateur et peut gérer les demandes Cross Origin.
Par exemple, Facebook JavaScript API et Google JS API.
Dans le cas où votre fournisseur d'API n'est pas à jour et ne prend pas en charge l'en-tête Cross Origin Resource Origin '*' dans sa réponse et n'a pas d'API JS (Oui, je parle de vous Yahoo), vous êtes frappé avec l'une des trois options:
Utiliser jsonp dans vos demandes, ce qui ajoute une fonction de rappel à votre URL où vous pouvez gérer votre réponse. Attention, cela changera l'URL de la demande, votre serveur API doit donc être équipé pour gérer le? Callback = à la fin de l'URL.
Envoyez la demande à votre serveur API que vous contrôlez et qui se trouve dans le même domaine que le client ou dont le partage de ressources Cross Origin est activé à partir duquel vous pouvez proxy la demande au serveur API tiers.
Probablement le plus utile dans les cas où vous faites des demandes OAuth et devez gérer l'interaction utilisateur Haha!
window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')
la source
L'utiliser en combinaison avec Laravel a résolu mon problème. Ajoutez simplement cet en-tête à votre demande jquery
Access-Control-Request-Headers: x-requested-with
et assurez-vous que votre réponse côté serveur a cet en-tête définiAccess-Control-Allow-Headers: *
.la source
Access-Control-Allow-Headers
JQ correct et à fournir un correctAccess-Control-Request-Headers
(plus tout ce que vous ajoutez via le code) qui ne peuvent pas être des caractères génériques. il suffit d'un seul "mauvais" en-tête pour faire exploser le pré-vol, par exemple en utilisantIf-None-Match
pour un GET conditionnel, si le serveur ne l'a pas répertorié.Pour une raison quelconque, une question sur les demandes GET a été fusionnée avec celle-ci, je vais donc y répondre ici.
Cette fonction simple obtiendra de manière asynchrone une réponse d'état HTTP à partir d'une page compatible CORS. Si vous l'exécutez, vous verrez que seule une page avec les en-têtes appropriés renvoie un état 200 si elle est accessible via XMLHttpRequest - que GET ou POST soit utilisé. Rien ne peut être fait du côté client pour contourner cela, sauf éventuellement en utilisant JSONP si vous avez juste besoin d'un objet json.
Les éléments suivants peuvent être facilement modifiés pour obtenir les données contenues dans l'objet xmlHttpRequestObject:
la source
J'ai eu exactement le même problème où jquery ajax ne m'a donné que des problèmes de cors sur les demandes de publication où les demandes de travail ont bien fonctionné - j'ai fatigué tout ce qui précède sans aucun résultat. J'avais les en-têtes corrects sur mon serveur, etc. Changer pour utiliser XMLHTTPRequest au lieu de jquery a résolu mon problème immédiatement. Peu importe la version de jquery que j'ai utilisée, elle ne l'a pas corrigé. La récupération fonctionne également sans problème si vous n'avez pas besoin de compatibilité de navigateur en amont.
Espérons que cela aide toute autre personne aux mêmes problèmes.
la source
Voici un résumé de ce qui a fonctionné pour moi:
Définissez une nouvelle fonction (encapsulée
$.ajax
pour simplifier):Usage:
Fonctionne également avec
.done
,.fail
, etc:Côté serveur (dans ce cas où example.com est hébergé), définissez ces en-têtes (ajout d'un exemple de code en PHP):
C'est le seul moyen que je connaisse pour vraiment POSTER l'inter-domaine à partir de JS.
JSONP convertit le POST en GET qui peut afficher des informations sensibles dans les journaux du serveur.
la source
Si, pour certaines raisons, en essayant d'ajouter des en-têtes ou de définir une stratégie de contrôle, vous n'obtenez toujours rien, vous pouvez envisager d'utiliser apache ProxyPass…
Par exemple, dans celui
<VirtualHost>
qui utilise SSL, ajoutez les deux directives suivantes:Assurez-vous que les modules Apache suivants sont chargés (chargez-les à l'aide de a2enmod):
Évidemment, vous devrez changer l'url de vos requêtes AJAX afin d'utiliser le proxy apache…
la source
C'est un peu tard pour la fête, mais je me bats avec ça depuis quelques jours. C'est possible et aucune des réponses que j'ai trouvées ici n'a fonctionné. C'est d'une simplicité trompeuse. Voici l'appel .ajax:
Voici le php côté serveur:
la source
$.ajax()
un serveur correctement configuré. La partie la plus difficile est d'obtenir leAccess-Control-Request-Headers
bon, mais même cela n'est pas trop difficile. Comme indiqué par les affiches précédentes, il ne doit pas s'agir d'un caractère générique, mais d'une liste blanche d'en-têtes.