HTML5 FormData zum Serialisieren von Formulareingaben

Weniger Programmieraufwand mit dem neuen Objekt FormData

, , Senden
Seite neu Laden

Rohdaten im Request Message-Body

Senden Sie das Formular ...

Erläuterungen

Formulareingaben werden als Schlüssel-Werte-Paare übertragen. Sofern das mit Ajax erfolgen soll, müssen diese Eingaben serialisiert werden und dies erledigte vor HTML5 eine Library über den dedizierten Zugriff auf jedes einzelne Formularelement deren Daten schließlich im Enctype application/x-www-form-urlencoded übertragen werden konnten.

Mit dem neuen JS-Objekt FormData vereinfacht sich diese Angelegenheit enorm. Dem Konstruktor wird ganz einfach das "Formular" übergeben:



Und das wars auch schon. Aber schauen wir mal hinter die Kulissen, wie das beim Server ankommt, das sehen Sie mit einem Klick auf den ersten Button oben im Formular. Das Popup zeigt Ihnen exakt die gesendeten Daten, die serverseitig bei einem POST aus STDIN gelesen werden. Wenn Sie FormData verwenden, funktioniert das verständlicherweise nur bei einem POST mit dem enctype="multipart/form-data".

Zum weiteren Verständnis: Der clientseitig codierte enctype ergibt den HTTP-Request-Header Content-Type, womit der serverseitige Prozess erkennen kann, wie die Eingaben zu parsen sind, dafür wird auch die Boundary im Request-Header mitgeliefert. Ein Content-Type-Reponse-Header hingegen gibt dem Client bekannt, welche Inhalte zu erwarten sind, z.B. text/html oder image/gif.

File Upload

Das FormData-Objekt ermöglicht das Upload über Inputfelder vom type="file" oder auch ohne dass eine Datei physikalisch über formular-input-type-file eingefügt wird. Der serverseitige Prozess erkennt ein Upload daran, dass es im Komponenten-Header den Parameter filename gibt. Zur Erinnerung: Der Enctype="multipart/form-data" beschreibt eine Multipart-Message, sie besteht aus mehreren Komponenten. Jede Komponente (subpart) hat einen eigenen Header, welcher optional den Content-Type beschreibt und die einzelnen Komponenten sind mit einer boundary voneinander getrennt, Beispiel siehe oben.

Maßgeblich dafür, dass ein solches Upload emuliert wird: Aus den Eingaben ins DOM wird ein Blob erstellt:

    formData.append('file', new Blob([data], { type: 'text/plain; charset=UTF-8'  }));

Und damit die Methode FormData.append() aufgerufen. Grundsätzlich überträgt HTTP keine Objekte sondern Bytesequenzen, egal ob JSON oder XML. Für obenstehende DEMO wird ein FormData-Objekt im scalaren Kontext gesendet und auch wieder empfangen. Das heißt: Übertragen werden serialisierte Daten, nicht jedoch das Objekt an sich.

Die übertragene Bytesequenz enthält jedoch alle Daten, die eine Wiederherstellung abstrakter Datenstrukturen ermöglichen. Letztendlich jedoch, gibt es zweckmäßigere Lösungen zum Serialisieren komplexer und insbesondere zyklischer Datenstukturen. Für einen asynchronen Request werden verschiedene Response-Types akzeptiert (Default ist text):

xhr.responseType = 'text' || ['arraybuffer', 'blob', 'document']

Der callback-Funktion wird dann callbackfunktion(xhr.response); übergeben, wenn responseType klassifiziert wurde.

Umwandlung der Enctypes

Eine FormData-Instanz kapselt die Formulardaten im Enctype multipart/form-data. Sofern der Wunsch besteht, diesen Enctype umzuwandeln in den Default-Enctype application/x-www-form-urlencoded, kann dies mit untenstehendem CODE gemacht werden:

// multipart/form-data
var fdata = new FormData(form);
var q = new URLSearchParams();
for (const [key, val]  of fdata.entries()) {
    q.append( key, val );
}
// application/x-www-form-urlencoded
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send( q );

Hinweis: Wenn das URLSearchParams() Objekt übergeben wird, also nicht der String, generiert xhr spontan den richtigen Content-Type-Header.


Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. nmq​rstx-18­@yahoo.de

Ihre Bewertung zu HTML5 FormData zum Serialisieren von Formulareingaben


Sterne auf einer Skala von 1..5 👎 👍
Ihr optionaler Kommentar: