10
votes

En utilisant Ajax, comment tirez-vous et oubliez-vous à travers les domaines

Je veux faire un appel d'un incendie et d'oublier JQuery à un service Web.

Fondamentalement, je souhaite envoyer un objet JSON à http://myservice.com/userservisits/create et Je ne me soucie pas de recevoir une réponse de retour . Cependant, nous souhaitons utiliser le même service pour plusieurs de nos domaines, ce qui signifie que les restrictions croisées religieuses liées à Ajax.

Comment faites-vous cela? Il y a beaucoup de choses sur JSON et telles, mais je n'ai pas besoin de gérer une réponse. J'ai envie de me manquer un détail évident.


10 commentaires

Pas un duplicata. Le lien fourni dit "J'ai besoin de saisir et d'analyser la réponse après." Je n'ai pas besoin d'analyser la demande.


Juste, mais vous pouvez le faire comme ça et tout simplement pas analyser la réponse ...


J'espérais qu'en n'avoir pas besoin de la réponse qu'il y aurait une approche plus simple.


@JOHN: Le duplicata fourni a de nombreuses réponses approfondies décrivant comment vous pouvez le faire avec / sans se soucier de la réponse.


Je suis d'accord, mais il peut y avoir d'autres solutions plus simples lorsqu'une réponse n'est pas nécessaire par rapport à quand on est. Gilly3 a un tel exemple ci-dessous.


@Andrewwhwhitaker - On me rappelle ce que Jeff a dit à propos de similaire questions dans un Blog Poste concernant les doublons : «Il est souvent bénéficié d'avoir plusieurs variantes subtiles d'une question autour, car les gens ont tendance à demander et à rechercher en utilisant des mots complètement différents, et mieux notre couverture, meilleures chances que nos collègues chanceux peuvent trouver la réponse. ils recherchent ". Souvent, en gardant près des doublons Open améliore Stackoverflow. Outre le référencement, il est également utile quand ils se présentent comme une question "liée" à droite.


@ GILLY3: La fermeture d'une question ne le supprimera pas par magie des résultats de la recherche. Aussi, je n'ai jamais dit que c'était une question une question ou que cela devrait être supprimé , je souligne simplement que je pense que c'est un duplicata d'une question précédemment posée. Cette question serait toujours "autour" et localisable, elle profite toujours à la communauté. Je classerais cela sous le n ° 2 du lien que vous avez posté.


En outre, @john, Gilly3 pourrait tout aussi facilement avoir répondu à la question liée.


L'un des malheureux aspects de Stackoverflow est qu'il renforce un aspect de notre profession pour intimider les personnes ayant moins d'expérience de l'industrie / connaissances / éducation / ainsi de réputation. I, l'auteur de la question (aka celui qui a besoin d'aide), admet que l'autre question a de la valeur, mais ne croyez pas que cela répond complètement à ma question. Mon échange avec @Adam montre ce que je veux dire et je tire la valeur de ses clarifications de suivi à mes questions. Vous croyez peut-être que j'aurais dû pouvoir comprendre la réponse de l'autre question, mais est-ce vraiment votre appel?


L'aspect malheureux de la conclusion d'une question qui n'est pas une duplication exacte est qu'il devient impossible d'ajouter une nouvelle réponse spécifique à cette question qui n'est pas applicable à l'autre question.


3 Réponses :


1
votes

Le fait que vous n'aurez pas voulu que le dos des données ne soit effectivement pas pertinent, vous êtes toujours confronté aux mêmes problèmes de domaine croisé. Il y a deux façons que vous pouvez aller ...

1) Vous pouvez utiliser JSONP (qui fait réellement une demande d'obtention) d'envoyer les données à travers bien que cela se sent un peu désordonné, car vous devriez essayer d'utiliser des verbes HTTP pour leur intention (c.-à-d. GET devrait récupérer des données).

2) Vous pouvez utiliser ARR (routage de demande d'application dans IIS) pour réécrire essentiellement la demande. Vous serez donc configuré une règle pour chaque domaine pour avoir une règle de réécriture par règle. www.mydomain.com/webcall voie à http://myservice.com/userservisits/create où MyDomain. com est le domaine où l'appel Ajax est en cours d'initiation. Si vous le faites, vous pouvez utiliser AJAX de la manière habituelle car autant que le navigateur vous inquiète, vous faites maintenant des demandes sur le même domaine


0 commentaires

2
votes

Le fait que vous ne traitez pas la réponse n'affecte pas le même problème de politique d'origine auquel vous êtes confronté. Mais, le fait que vous contrôleriez tous les consommateurs du service ouvre la possibilité d'utiliser Cors . Cependant, tous les navigateurs ne soutiennent pas les CORS. Voir le tableau de compatibilité du navigateur. Si vous devez prendre en charge les autres navigateurs, vous devez toujours utiliser JSONP.


6 commentaires

Par "Utiliser JSONP", voulez-vous dire juste le type de données: "JSONP"? Que signifie "utiliser JSONP" si vous n'avez pas de rappel?


@John Cela signifie utiliser l'injection d'élément de script. Fondamentalement, tout ce que vous avez à faire est de créer un élément de script sur la page avec l'URL que vous souhaitez frapper comme source. Votre service a-t-il besoin d'un poste ou d'une demande d'obtenir?


Je peux construire le service à prendre soit soit, bien que la publication plus correctement identifie correctement que quelque chose est fait, pas récupéré.


Obtenir serait plus facile. Ensuite, tout ce que vous avez à faire est d'utiliser DataType JSYP.


donc je viens d'utiliser $ .get (... DataType: "JSONP" ...) et n'inclut pas de rappel et ça fonctionnera? Est-ce que c'est ça?


Je pense que cela fonctionnera pour faire une demande de domaine croisé. Essaye le.



8
votes

Le moyen le plus simple d'envoyer une demande HTTP GET est avec une balise d'image: xxx

et, vous pouvez même obtenir un peu d'informations en manipulant le charger et erreur événements. Bien sûr, si la réponse n'est pas une image, l'événement erreur sera appelé, et non charger . Vous pouvez définir votre service pour renvoyer une image de pixel unique pour résoudre ce problème.

EDIT: Vous mentionné Vous préférerez peut-être utiliser un poste http. Ce n'est pas aussi simple qu'une balise d'image, mais vous pouvez créer un message croisé à l'aide d'un iframe caché: xxx

i pense jQuery a quelque chose comme ça construit déjà. Vous pouvez essayer de creuser dans le jquery.ajax documentation. Sinon, vous pouvez probablement trouver un plugin qui le fait.


4 commentaires

Bien que cela puisse être un bon moyen de gérer les choses, il n'ya aucun moyen de gérer les cas d'erreur, car l'OP ne semble pas être concerné par la réponse qui pourrait être correcte. Vous pouvez également définir le gestionnaire "Onerror" sur l'objet Image, mais il n'est pas moyen de communiquer les données d'erreur réelles à la classe d'appel, ne gère que des erreurs génériques de cette façon.


@FilmJ - Bien sûr. Mais cette question concerne le cas spécifique où vous n'allez pas analyser la réponse. L'approche de balise d'image est parfaitement adaptée à cela.


@FilmJ - En outre, vous pourriez être très créatif avec la manipulation des erreurs. Une image 1PX par 1PX peut indiquer le succès. Toute autre taille d'image pourrait indiquer un code d'erreur, déchiffré par la taille. Ou un message d'erreur peut même être affiché dans l'image résultante.


Toutes les réponses données sur le travail et sont appréciées. À long terme, je pense que Cors est la réponse, mais je ne suis pas prêt à le faire aujourd'hui. J'ai marqué cela comme la "réponse", car il offre un hack intelligent (le support de navigateur pour les images est aussi vieux que le temps) et une solution iframe qui fonctionnera si le service étant appelé est reposant.