Moin Moin,
ich stand vor kurzem vor dem Problem, eine Kommunikation zwischen einem Client und einem Server im Browser zu realisieren, die auf unterschiedlichen Server/Domains liegen.
Vom Prinzip her so:
Ein Client auf Seite A (www.lets-get-nerdy.de), möchte von dem Server B (www.lets-get-nerdy.com) Informationen beziehen.
Zuerst hatte ich mir gedacht: „Klar, dafür benutze ich doch ein einfaches Ajax-Konstrukt“. Aber da hatte ich die Rechnung ohne die „same origin policy“ gemacht. Die „same origin policy“ ist ein Sicherkonzept, welches u.a. verbietet, domainübergreifende Ajax-Aufrufe durchzuführen.
Also musste eine andere Technik her. Nach kurzer Recherche bin ich auf JSONP gestoßen (JSON with Padding) – ich finde den Namen zwar etwas unpassend, aber ist in Ordnung, solange es funktioniert.
Das Prinzip hinter JSONP ist so einfach, dass man sich eigentlich sofort denkt: „da hätte ich auch drauf kommen können“.
Wir betrachten dazu 2 Seiten. Auf der Clientseite binden wir ein einfaches Skript ein, welches nachdem das DOM geladen wurde, ein Javascript dynamisch nachlädt. Als Source für das Script-Tag geben wir einfach den Pfad inkl. Querystring von dem zu bearbeitenden Server an, von dem wir die Antwort erhalten wollen.
Clientseite:
var url = "www.lets-get-nerdy.com/doJSONP.php?myquery=123&callback=myCallback"; // query
var script = document.createElement("script"); // script-tag erzeugen
script.setAttribute("src", url); // query url hinzufuegen
script.setAttribute("type", "text/javascript"); // typ setzen
document.getElementsByTagName("head")[0].appendChild(script); // script-tag dem DOM hinzufuegen
function myCallback(data)
{
// wird bei Antwort ausgefuert
}
Auf der Serverseite nehmen wir dann die Query entgegen und erzeugen eine Antwort.
echo $_GET['callback']."('".json_encode($data)."')";
Die Antwort des Servers sorgt dafür, dass Clientseitig die Funktion „myCallback“ aufgerufen wird. Die Funktionsparameter füllen wir mit einem JSON enkodierten String. Wenn ich euch nun zeige, wie eine solche Antwort aussehen kann, wird sicherlich alles klar:
myCallback('{myquery : 123, message: moin}');
Somit können wir auf einfache Art und Weise eine Anfragen an einen entfernten Server senden und erhalten eine Antwort zurück. Man sollte natürlich weitere Mechanismen einbauen, die den anfragenden „Client-Server“ auch verifizieren, damit nicht von jeder Seite eine Anfrage an euren Server gemacht werden kann.
In jedem Fall, solltet ihr festlegen, von welchem Server Anfragen bearbeitet werden sollen. Stichwort „Access-Control-Allow-Origin“. Ich gebe dem Querystring auch immer noch einen timestamp mit und akzeptiere auf dem Server nur anfragen, die nicht älter als bspw. 5 Sekunden sind.
Viel Erfolg mit JSONP.