2009-10-16 13 views
5

J'essaie de faire une demande POST inter-domaine et d'avoir touché un mur (ou deux).Demande POST de sous-domaine de traversée synchrone avec jQuery

Je ne peux pas mettre une page proxy sur le serveur - ce n'est donc pas une option.

J'ai recherché getJSON, qui fonctionne très bien, sauf que j'ai besoin de POST pas obtenir.

Est-ce possible? Si c'est et non, quelqu'un peut-il m'expliquer comment fonctionne getJSON et pourquoi je ne peux pas faire une alternative POST?

Répondre

26

Vous CANNOT faire une demande inter-domaines (GET/POST/etc) avec un XMLHttpRequest (alias AJAX).

Ce que vous pouvez faire, lorsque le serveur le prend en charge, est de faire une requête JSONP. Une demande JSONP fonctionne comme suit:

  • jQuery crée une fonction globalement accessible de la fonction de rappel que vous fournissez comme argument
  • Au lieu d'utiliser XMLHttpRequest (AJAX) pour faire la requête HTTP, jQuery insère dynamiquement un SCRIPT balise dans le DOM
  • le SRC de la balise de script est l'URL de la requête à laquelle vous essayez de communiquer
  • jQuery ajoute un rappel à la chaîne param de requête comme ceci: example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • Il est alors en place au serveur pour retourner JavaScript que votre client peut utiliser en passant le résultat JSON comme argument pour someDynamicallyGeneratedMethodName

Si vous avez aucun contrôle du serveur que vous envoyez des messages, alors vous êtes hors de la chance, JSONP gagné Ne te fais pas beaucoup de bien. Quel que soit le retour du serveur sera dans une balise SCRIPT, et sera probablement jeter une erreur si elle n'est pas formatée correctement.

Pour plus d'informations à ce sujet, je vous suggère de regarder la fonction $ .ajax de base au lieu des raccourcis. (Dans la documentation de jQuery sous Ajax. Désolé je ne peux pas poster plus de liens)

Encore une fois, si vous n'avez pas le contrôle du serveur auquel vous envoyez des messages, vous devriez peut-être chercher un proxy si possible. Sinon, un IFRAME peut être votre seule autre option. Il existe également une méthode pour y parvenir avec un objet SWF (flash). J'ai essayé non plus, mais ils sont des solutions de contournement aux limitations de l'objet XMLHttpRequest.

J'espère que je pourrais vous aider!

+0

+1. Super article, et bienvenue à SO! – aolde

+0

Merci pour l'explication. C'est beaucoup plus clair après une heure Googling. J'ai accès au serveur sur lequel je poste, donc tout va bien. –

+2

Err, c'est quoi ce commentaire lié au sujet? Cela ne couvre pas le POST que l'ergothérapeute demande spécifiquement! – HRJ

2

Vous pouvez faire un post, mais ce que vous voulez, c'est une demande JSONP pour contourner les problèmes inter-domaines. Essentiellement, vous fournissez une fonction de rappel et la requête revient en tant que contenu de script et votre callback est appelé avec les données JSON de la requête. Votre script côté serveur devra fournir les données en tant qu'appel de fonction à l'aide de la fonction de rappel encapsulée autour de l'objet JSON.

Voir la documentation sur la fonction post.

$.post('/example.com/controller/action?callback=?', 
     { param: "data" }, 
     function(data) { 
      ...do something with the data... 
     }, 'jsonp'); 

l'action ASP.NET MVC pour cela:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Action(string param, string callback) 
{ 
    var jsonData = ...do something and construct some data in JSON... 

    return Content(callback + "(" + jsonData + ");"); 
} 
+1

Pour référence future: il semble que Google Chrome 6.0.472.63 n'aime pas trop ça. Dans Safari, il traite le JSON retourné, mais Chrome montre simplement que «l'origine null n'est pas autorisée par Access-Control-Allow-Origin». message. – Cimm

0

Si vous voulez faire un POST de domaine croisé, alors la solution la plus simple est celle fournie par Matteo here. Cela a fonctionné très bien pour moi