Matti Mäkitalo: CGI mit Ajax-Erweiterung (Design Patterns)

Beitrag lesen

Hi,

if($self->{AJAX}){
# gebe nur das Resultat aus
}
else{
}
[/code]

Ich finde es nicht sinnvoll, serverseitig eine Fallunterscheidung zu machen, welche Client-Architekturen verwendet werden.

Du hast momentan zwei Ausgabemethoden implementiert, einmal das reine Ergebnis, einmal eine komplette HTML-Seite.

Ich empfahl dir, den Accept-Header zu verwenden. Der Header sagt aus, welche Ergebnis-Arten der Client verarbeiten kann. Fragt der Client mit z.B. "Accept: application/json" an, so weißt du, dass du JSON ausgeben willst (ein einzelner Wert wäre valides JSON). Du kannst XMLHttpRequest so einstellen, dass es den entsprechenden Header sendet.

Ein Browser fragt üblicherweise mit anderen Accept-Headern an. Dann lieferst du (entsprechend der Anfrage) etwas anderes aus (z.B. wird ein "Accept: text/html" üblicherweise die Ausgabekomponente für HTML auslösen).

Warum Accept und nicht als anderer Parameter?
Zum einen wäre die Fallunterscheidung über Accept die natürliche Weise, wie man es mit HTTP machen würde. Zum anderen willst du irgendwann noch andere Ausgabemethoden implementieren. Vielleicht willst du das Ergebnis mal als PDF.
Dann wäre es sinnvoller, anhand des Accept-Headers ein Template aufzurufen. Der Controller entscheidet anhand des Headers, welches Template aufgerufen wird. Dann implementierst du deine n Templates, dasjenige für die "AJAX"-Ausgabekomponente ist dann einfach nur das formatierte Ergebnis, also sehr elementar. Wenn weitere Ausgabemöglichkeiten hinzukommen, dann brauchst du nur die Templates dafür implementieren, und ansonsten nichts anpassen.

Bis die Tage,
Matti