Dans le domaine du Web, on connait déjà l’AJAX et le JSON. Mais on connait aussi ces limitations … à savoir pas moyen d’interroger avec XMLHttpRequest un autre domaine.
Le JSONP, pour JSON Padding peut nous permettre de passer outre cette limitation. Mais je trouve le nom plutôt mélangeant en fait.
Le principe de tout cela repose sur une manipulation du DOM.
Commencons par parler de la balise <script>, celle ci nous permet de charger du Javascript sans restriction de la provenance.
La preuve en est, il est aujourd’hui courant d’utiliser un CDN pour charger une librairie Javascript.
Voici un exemple de scénario, j’ai une page Web sur domaineA.com et j’ai besoin d’aller chercher des données sur domaineB.com/data.
Alors qu’avec XMLHttpRequest je ne peux faire ça sans utiliser un fichier proxy (en PHP par exemple), je peux aisément utiliser une balise <script> en utilisant la propriété “src”.
Supposons que le web-service sur domaineB me renvoit du JSON, par exemple {['data1','data2','data3']}.
En javascript, il est simple de créer la dite balise dynamiquement.
script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.domaineB.com/data"
Au final, nous avons :
<script>{['data1','data2','data3']}</script>
Bon nous avons chargé des données d’un autre serveur mais cela ne nous aide pas beaucoup plus. Supposons maintenant que le web-service nous permette de lui passer en argument une fonction de call-back. Et que le dit serveur nous renvois nos données avec la fonction de call-back.
Par exemple si on interroge http://www.domaineB.com/data?call-back=my_callback le serveur nous renvoit alors dans notre balise <script>
<script>my_callback({['data1','data2','data3']})</script>
Et là notre fonction javascript my_callback peut prendre le relais pour traiter les données reçues d’un autre domaine.
Cela n’est pas vraiment de l’AJAX mais plutôt de l’AJAX-like, mais c’est un beau moyen d’outre-passer la limitation de XMLHttpRequest.
Attention toutefois pour que cela fonctionne, il faut que le web-service appellé nous permette de gérer une fonction de call-back.