web-dev-qa-db-fra.com

Comment envoyer une demande AJAX sur un autre port avec jQuery?

J'ai besoin d'envoyer une demande AJAX, par exemple, au port 8080 où un démon y est exécuté.

37
user198729

Vous ne pouvez pas POST informations entre domaines, sous-domaines ou numéros de port. Vous pouvez cependant utiliser JSONP si vous avez accès à la fois au démon et au site demandeur. Si des données doivent être renvoyées, le daemon doit prendre en charge un paramètre de requête callback et le renvoyer correctement formaté.

Transmettez les informations au démon:

$.getJSON('http://domain.com:8080/url/here?callback=?', {
  key: 'value',
  otherKey: 'otherValue'
}, function(data){
     // Handles the callback when the data returns
});

Assurez-vous maintenant que votre démon gère le paramètre callback. Par exemple, si callback=mycallback le retour du démon (la seule chose écrite sur la page) devrait ressembler à ceci:

Pour une paire clé/valeur:

mycallback( {'returnkey':'returnvalue', 'other':'data' });

Pour un tableau:

mycallback( [1,2,3] );

Si vous n'avez pas de mécanisme JSONP ou similaire en place, vous ne pouvez pas communiquer entre domaines à l'aide de jQuery.

31
Doug Neiner

Cela rompt la même politique d'origine . Vous ne pouvez pas utiliser un port différent, même lorsque vous utilisez le même domaine.

Vous pouvez utiliser JSONP comme Doug suggéré.

Ou bien, comme une autre solution de contournement possible, vous pouvez configurer un très simple proxy inverse (en utilisant mod_proxy si vous êtes sur Apache). Cela vous permettrait d'utiliser des chemins relatifs dans votre demande AJAX, tandis que le serveur HTTP agirait comme un proxy pour n'importe quel emplacement "distant".

La directive de configuration fondamentale pour configurer un proxy inverse dans mod_proxy est le ProxyPass. Vous l'utiliseriez généralement comme suit:

ProxyPass     /ajax/     http://www.localhost:8080/

Dans ce cas, vous demanderez /ajax/test.xml avec jQuery, mais en fait, le serveur servirait cela en agissant comme un proxy pour http://www.localhost:8080/test.xml en interne.

Si vous utilisez IIS, vous pouvez utiliser Managed Fusion URL Rewriter et Reverse Proxy pour configurer un proxy inverse.

41
Daniel Vassallo

Cela compte comme une origine différente, même si vous l'avez sur la même boîte, juste un port différent.

Si vous ciblez principalement de nouveaux navigateurs comme FireFox 3.5 et versions ultérieures, vous pouvez essayer d'ajouter Access-Control les en-têtes de votre application dans un autre port et permettent d'appeler à partir de votre pool d'applications par défaut. Des informations sur les en-têtes de contrôle d'accès peuvent être trouvées ici: https://developer.mozilla.org/en/HTTP_access_control

IE l'implémente également (encore une fois, en utilisant un contrôle ACTIVEX différent, pourquoi?): http://blogs.msdn.com/ie/archive/2009/01/14/completing-access-control-support -for-xdomainrequest.aspx et http://msdn.Microsoft.com/en-us/library/cc288060 (VS.85) .aspx

2
naivists