Tim Tepaße: Prototype, JSON als Transportformat für Datenstrukturen

Beitrag lesen

Hallo Murder,

bei Ajax steht

Ah, es geht also um Prototype.

Sometimes the application is designed to send JavaScript code as a response. If the content type of the response matches the MIME type of JavaScript then this is true and Prototype will automatically eval() returned code. You don't need to handle the response explicitly if you don't need to.

Was die damit meinen ist, dass es beim Erstellen eines Prototype-Ajax-Request-Objektes die Option EvalJS mit möglichen Werten true und false gibt. Wenn die Option nicht explizit auf false gesetzt wird, wird ein true angenommen. Und wenn Du dann noch einen dieser MIME-Typen in HTTP-Antwort angibst ... application/ecmascript, application/javascript, application/x-ecmascript, application/x-javascript, text/ecmascript, text/javascript, text/x-ecmascript, oder text/x-javascript ... wird der Text mit eval() als Javascript ausgeführt. Das ist nicht so toll, wenn man da auch Funktionen und sonstigen aktiven Javascript-Krempel in der HTTP Response drin hat.

Für Dich spannender ist die auch im default auf true stehende Option EvalJSON. JSON ist eine Teilmenge von Javascript, im wesentlichen aus der JS-Schreibweise von Objekten, Arrays, Zahlen, Strings und Wahrheitswerten besteht. Die Schreibweise für die Daten, die Du übergeben willst, sähe dann so aus:

{ x : 100, z : 50 }

Sprich so, wie man Datenstrukturen in JS auch schreiben würde. Das Tolle an der Reduziertheit auf Datenstrukturen ist, dass da eher keine Funktionen oder ähnlich das Browserfenster veränderten Dinge mitgeliefert werden und vor allem dass evil eval() nicht zum Zuge kommt. Und für diese Datenstrukturen gibt es in vielen Programmiersprachen auch eingebaute Funktionen oder Bibliotheken mit diesen Funktionen. PHP hat seit Version 5.2.0 die Funktion json_encode, mit der Du z.B. ein PHP-Array Deiner Werte über die Leitung schicken könntest. Wenn Du dann noch vorher mit header() den Content-Type application/json angibst, dann könntest Du solch einen JS-Code schreiben:

~~~javascript new Ajax.Request(url, {
      method: 'get',
      onSuccess: function(response) {
          var obj = response.responseJSON; // responseJSON enthält ein JS-Objekt
          tueWasMit(obj.x);                // ... auf dessen Attribute man dann
          tueWasAnderesMit(obj.z);         // ... wie in JS üblich zugreifen kann
      }
  });

  
  
Tim