J'ai besoin d'envoyer une demande AJAX, par exemple, au port 8080 où un démon y est exécuté.
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.
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.
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