jQuery.getJSON - Access-Control-Allow-Origin Problème
Je suis jusing de jQuery $.getJSON()
fonction de retour d'une petite série de données JSON.
J'ai les données JSON assis sur une url telle que example.com
.
Je ne le savais pas, mais comme j'étais accès à la même url, les données JSON ne pouvait pas être chargé. J'ai suivi grâce à la console et a constaté que XMLHttpRequest
ne pouvait pas charger en raison de Access-Control-Allow-Origin
.
Maintenant, j'ai lu, beaucoup de sites qui ont juste dit d'utiliser $.getJSON()
et qui serait le contourner, mais évidemment ça ne fonctionne pas. Il ya quelque chose que je devrais changer dans les en-têtes ou dans la fonction?
Aide est grandement appréciée.
- Peut-être vous voudrez peut-être regarder à JSONP: en.wikipedia.org/wiki/JSONP.
- Une alternative serait de transmettre votre demande et de la réponse à l'aide d'un proxy (par exemple PHP curl), si ce qui vous est offert.
Vous devez vous connecter pour publier un commentaire.
C'est simple, utilisez
$.getJSON()
fonction et dans votre URL, il suffit d'inclureen tant que paramètre. Qui va convertir l'appel à JSONP qui est nécessaire pour faire de la croix-domaine d'appels. Plus d'infos: http://api.jquery.com/jQuery.getJSON/
Vous pouvez vouloir utiliser JSON-P à la place (voir ci-dessous). D'abord une explication rapide.
L'en-tête que vous avez mentionné, c'est à partir de la Origine De La Croix De Partage De Ressources standard. Attention, il est pas pris en charge par certains navigateurs personnes réellement utiliser, et sur d'autres navigateurs (Microsoft, soupir), il nécessite l'utilisation d'un objet spécial (
XDomainRequest
) plutôt que la normeXMLHttpRequest
qui utilise jQuery. Elle vous demande aussi de changer de serveur-côté des ressources d'autoriser explicitement les autre origine (www.xxxx.com
).Pour obtenir les données JSON que vous demandez, en gros, vous avez trois options:
Si possible, vous pouvez être au maximum-compatible en modifiant l'emplacement des fichiers que vous êtes en train de charger, de sorte qu'ils ont la même origine que le document que vous êtes en train de charger dans. (Je suppose que vous devez être chargé via Ajax, d'où le Même La Politique De L'Origine question qui se montre.)
Utilisation JSON-P, ce qui n'est pas soumis à la SOP. jQuery a un support intégré pour elle dans son
ajax
appel (juste misdataType
à "jsonp" et jQuery va faire tout le côté client de travail). Cela nécessite des modifications côté serveur, mais pas très gros; fondamentalement, ce que vous avez c'est la génération de la réponse JSON semble juste pour un paramètre de chaîne de requête appelé "rappel" et enroule le JSON dans le code JavaScript qui appelle la fonction. E. g., si votre réponse JSON est:Votre script va chercher le "rappel" paramètre de chaîne de requête (disons que la valeur du paramètre est "jsop123") et des emballages de JSON dans la syntaxe d'un appel de fonction JavaScript:
Que c'est. JSON-P est très largement compatible (parce qu'il fonctionne via JavaScript
script
tags). JSON-P est uniquement pourGET
, cependant, ne pasPOST
(encore une fois parce qu'il fonctionne viascript
tags).Utilisation de la SCRO (le mécanisme lié à l'en-tête que vous avez cité). Détails dans la spécification ci-dessus, mais en gros:
A. Le navigateur va envoyer votre serveur en un "contrôle en amont" message à l'aide de la
OPTIONS
HTTP verbe (méthode). Il contiendra les différents en-têtes de les envoyer avec leGET
ouPOST
ainsi que les en-têtes "Origine", "Contrôle d'Accès-Demande-de la Méthode" (p. ex.,GET
ouPOST
), et "Access-Control-Request-Headers" (les en-têtes de il veut envoyer.B. PHP décide, en se fondant sur cette information, si la demande est acceptable et, dans l'affirmative répond avec le "Access-Control-Allow-Origin", "Access-Control-Allow-Méthodes", et "Access-Control-Allow-les en-Têtes" en-têtes avec les valeurs qu'elle permettra. Vous n'envoyez pas de tout le corps (de la page) avec cette réponse.
C. Le navigateur va chercher à votre réponse, et de voir s'il est autorisé à vous envoyer le réel
GET
ouPOST
. Si donc, il doit envoyer sa demande, à nouveau avec "l'Origine" et divers "Access-Control-Demande-xyz" en-têtes.D. PHP examine les en-têtes de nouveau pour s'assurer qu'ils sont encore en bon état, et si oui, répond à la demande.
Dans pseudo-code (je n'ai pas fait beaucoup de PHP, donc je n'essaie pas de faire de syntaxe PHP ici):
De nouveau en soulignant que c'est de la pseudo-code.
ajax
appel; j'ai ajouté quelques détails ci-dessus. Si vous voulez dire de la SCRO, alors oui, c'est en-têtes vous définissez via PHP en réponse à uneOPTIONS
requête HTTP et de nouveau en réponse à laGET
ouPOST
; j'ai ajouté quelques détails pour que ainsi. Mais c'est trop si il y a toute chance que vous pouvez simplement déplacer les fichiers de sorte qu'ils sont sur la même origine.?callback=
dans l'URL que vous donnez$.getJSON
.