5. November 2013 | 1 Comment Hallo zusammen! Diese Woche möchte ich euch die ein- oder andere Kleinigkeit zum Thema „Ajax“ zeigen. Ganz grob geht es um die Fragestellung -der Titel hat es verraten- „Wie lassen sich echte Ajax Requests via PHP erkennen?“. Dies gilt es zu beantworten, doch natürlich möchte ich auch darauf eingehen wieso diese Information wichtig ist und worauf wir sonst noch achten sollten! Viele Entwickler nutzen Ajax Requests um Inhalte „in Echtzeit“ vom Server nachzuladen – Egal ob fertiges HTML oder Daten (im JSON Format o.Ä.). Doch nicht immer wird (Serverseitig) geprüft, ob es sich um einen echten Ajax Request handelt… Das kann, wenn man Pech hat, zu unschönen Effekten führen oder zusätzliche (aber eigentlich unnötige) Ajax Routen oder URL Parameter zur Folge haben. Aufwändige und unschöne Methoden Wie grade beschrieben könnten wir in unserer Applikation beispielsweise eigene Routen definieren, die ausschließlich für Ajax Requests genutzt werden sollen… Doch auch hier haben wir keinerlei „Sicherheit“, das diese Routen wirklich zu diesem Zweck genutzt werden… Das gleiche gilt für bestimmte Parameter innerhalb der URL (wie z.B. „index.php?ajax=1“)… Diese Optionen funktionieren zwar zuverlässig, sind aber nicht so sauber und durchdacht wie wir es gerne hätten. Warum ist das wichtig? Im Grunde ist diese Kontext-Unterscheidung wichtig um keinen unnötigen Code zu produzieren – keiner mag unnötigen Code! Durch das Unterscheiden ob „Ajax“ oder „Nicht Ajax“ ist es uns möglich diverse Bereiche unserer Applikation mehrfach zu verwenden ohne falsche Ausgaben zu fürchten. Ein Beispiel Stellen wir uns eine mehrseitige Liste vor: Damit wir für das blättern nicht die gesamte Seite nachladen müssen, verfügen wir über eine Logik die im „Ajax“ Fall die Daten der angeforderten Seite zurückliefert. Die Ajax URL könnte dabei so aussehen wie „example.com/my-list/page-2„. Um jedoch auch direkt per URL („example.com/my-list/page-2„, ja, die gleiche URL ;)) auf einzelne Seiten verlinken zu können, könnten wir im „Nicht Ajax“ Fall die vorbereiteten Daten (aus dem „Ajax“ Fall) nehmen und an unser Template (oder View-Logik) weiterleiten anstatt Sie via JSON zurückzuliefern… Und schon haben wir eine einzige URL, die auf den aktuellen Kontext reagiert! So einfach kann „richtig“ sein… Wir möchten also über eine einzige URL verschiedene Bereiche unseres Codes ansteuern. Hierzu benötigen wir einen sicheren Anhaltspunkt… Zum Glück hilft uns PHP mit dem globalen $_SERVER Array weiter – Hier finden wir (im Falle eines Ajax Requestes) den Schlüssel „HTTP_X_REQUESTED_WITH“, auf den wir folgendermaßen prüfen können: /** * Function to determine, if this is an ajax request or not. * * @return boolean */ function is_ajax_request () { return (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); } // Kohana Framework example, in controller context: if ($this->request->is_ajax()) { // ... } // Fat Free Framework example: $f3->route('GET /url [ajax]', function () { // ... }); // Slim Framework example: if ($app->request->isAjax()) { // ... } Was machen wir mit diesem „Wissen“? Das ist ganz einfach: Während wir bei initialen Seiten-Requests stets den kompletten HTML Body zurückliefern müssen, können wir uns an dieser Stelle sicher sein das es sich um nachgeladene Inhalte handelt. Wir können dadurch bestimmte Bereiche unseres Codes wiederverwenden, wie im Beispiel oben erklärt. Sehr hilfreich! Absolut – und genau aus diesem Grund sollte man sich diesen kleinen Code-Schnipsel aufbewahren! Falls ihr ein Framework benutzt ist es sehr wahrscheinlich, das dieses bereits eine ähnliche Funktionalität mitbringt (s.o.). Schaut euch dazu am besten dessen Dokumentation, FAQ und/oder Forum an. Ich möchte euch zum Thema Ajax außerdem noch diese beiden Blogeinträge empfehlen: Saubere Ajax Anfragen und Antworten und vielleicht auch Ajax-Requests mit Daten im Response-Header. Mit diesen Worten möchte ich mich für diese Woche verabschieden und wünsche euch allen eine angenehme Woche und natürlich „Happy Coding“!