La requête AJAX interdomaine ne fonctionne pas
Je vais appeler ce POST sur un tiers de l'API que j'ai travaillé avec via jQuery $.ajax fonction. Cependant, quand je fais l'appel, je reçois l'erreur suivante: XMLHttpRequest cannot load http://the-url.com. The request was redirected to 'http://the-url.com/anotherlocation', which is disallowed for cross-origin requests that require preflight.
J'ai vu de ce post que cela pourrait être une Webkit bug, donc je l'ai essayé sous Firefox (je suis en développement dans google Chrome) et j'ai obtenu le même résultat.J'ai essayé sur Chrome et Firefox, et j'obtiens le même résultat.
Par ce postj'ai aussi essayé d'utiliser jsonp à la fois par la définition de la crossDomain
propriété de l' $.ajax fonction de true
et le réglage de la dataType
à jsonp
. Mais, cela a provoqué une erreur de serveur interne 500.
Quand j'ai commencer à google Chrome avec l'option --disable-web-sécurité drapeau, je n'ai pas de problèmes. Cependant, si je démarre le navigateur normalement, puis je reçois le message d'erreur.
Donc, je suppose que cela pourrait en sorte d'en avoir un 2-partie de la question. Que puis-je faire pour faire cette demande de domaines? Si JSONP est la réponse, alors comment puis-je déterminer si la troisième partie de l'API est mis en place correctement à l'appui de cette?
EDIT: Voici la capture d'écran quand je fais l'appel avec le navigateur de sécurité désactivé: https://drive.google.com/file/d/0Bzo7loNBQcmjUjk5YWNWLXM2SVE/edit?usp=sharing
Voici la screenchost quand je fais l'appel avec le navigateur de sécurité est activée (comme d'habitude): https://drive.google.com/file/d/0Bzo7loNBQcmjam5NQ3BKWUluRE0/edit?usp=sharing
source d'informationauteur Don
Vous devez vous connecter pour publier un commentaire.
À votre première question,
Suivantes en-têtes de requête sont d'abord envoyées au serveur. Basé sur les en-têtes de réponse, le UserAgent, c'est à dire le navigateur ici, va rejeter la réponse(le cas échéant) et de ne pas remettre le XHR de rappel, lorsque les en-têtes ne s'ajoutent pas.
Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header
Votre serveur devrait alors répondre avec les en-têtes suivants:
Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header
Exemple tiré du - https://stackoverflow.com/a/8689332/1304559
Vous pouvez utiliser des outils comme Fiddler ou l'Inspecteur Web, dans l'onglet Réseau(Chrome) ou dans l'onglet réseau de Firebug pour trouver les en-têtes, le serveur envoie en réponse à votre demande.
La troisième partie de l'API de l'url du serveur doit répondre avec les valeurs prises en charge. Si ça ne marche pas, c'est votre problème.
Ne peut pas être d'une grande aide dans JsonP 500 server error, comme il est dit Erreur Interne du Serveur
Mise à JOUR
J'ai vu vos captures d'écran, un couple de choses à remarquer ici
HTTP POST
est utiliséAccess-Control
en-têtes trouvés dans les deux modes de réponse. Avec le deuxième code d'état comme302
Origin
en-tête de requête estnull
je crois donc que le fichier HTML est ouvert à partir du système de fichiers plutôt que de partir d'un site webPermettant JSONP
Arriver au point de pourquoi JSONP ne fonctionne pas, la raison - Le web de configuration du service(de la ASMX spécifié), n'a pas permis
GET
mode de la demande. JSONP ne fonctionne pas avecPOST
.Pourquoi
200
avec la sécurité est désactivée?La requête POST est appelé directement sans
OPTIONS
ou de contrôle en amont demande tiré avant, de sorte que le serveur a tout simplement répondu en arrière.Pourquoi
302
code de statut avec la sécurité activée?D'abord un peu comment cela se produit lorsque l'indicateur de sécurité n'est pas désactivé(par défaut). Le
OPTIONS
demande est tiré de l'URL. L'URL doit répondre avec une liste de HTTP méthodes qui peuvent être utilisées, c'est à direGET
POST
etc. Le code de statut de cetteOPTIONS
demande doit être200
.Dans le cas actuel, il y a une redirection appelée lors de cette opération. Et de le rediriger vers un gestionnaire d'erreur personnalisé pour un Serveur HTTP d'Erreur. Je crois que c'est
404
erreur, qui est la capture et la redirection.[Ce pourrait être parce que le gestionnaire personnalisé est défini àResponseRedirect
au lieu deResponseRewrite
] La raison de la404
est l'accès inter-domaine n'est pas activé.Dans le cas où la coutume d'erreur de manipulation a été désactivé, ce serait revenu
HTTP 500
code. Je crois que le problème peut être trouvée en vérifiant les journaux du serveur immédiatement après le tir d'une demande de domaines. Il sera bon de vérifier les logs du serveur pour les erreurs des autres que ce, le cas échéant.Solution Possible
Pour permettre l'accès, il y a deux façons - détaillé ici. Ou ajouter directement le contrôle d'accès des en-têtes
web.config
du fichiercustomheaders
section.Lors de l'accès inter-domaine est activé, le serveur doit répondre à des OPTIONS et de permettre à la demande. Il doit retourner
HTTP 200
moins il y a d'autres erreurs. Mais ajax de rappel ne sera pas en mesure d'accéder à la réponse. Cela peut être fait maintenant uniquement siAccess-Control-Allow-Origin
est réglé sur "*" ou leOrigin
- tête de la requête de la valeur, et laAccess-Control
en tant que de besoin. Et l'ajax rappel de recevoir la réponse comme prévu.Le troisième point, null
Origin
. Ce sera un problème si leOrigin
en-tête de demande de valeur est renvoyée commeAccess-Control-Allow-Origin
. Mais je suis en supposant que vous allez déplacer votre page HTML sur un serveur web, de sorte que ne devrait pas être un problème.Espérons que cette aide!
La solution que j'ai trouvé est d'utiliser cURL (comme @waki mentionné), mais une version légèrement modifiée qui prend en charge SOAP. Alors, au lieu de faire un appel AJAX à la troisième partie de l'API (qui n'est pas correctement configurée) je fais appel à mon local de fichier PHP qui permet alors un appel SOAP à la troisième partie de l'API et renvoie les données de mon fichier PHP où je peux les traiter ensuite. Cela me permet d'oublier la SCRO et toutes les complexités associées. Voici le code (repris et modifié à partir de cette question, mais sans authentification).
Vous pouvez utiliser cURL ?
Avec l'Ajax d'envoyer des données à votre gestionnaire (sur votre serveur, laissez appelé callback.php).
Dans votre fichier (callback.php) l'utilisation de cURL avec vos données:
dans votre $variable de retour que vous obtenez vos données.