Erweiterung des PHP Parsers um neue Enctypes im HTTP-Request

Im Browser heißt es Enctype, in HTTP ist das der Content-Type für die Request-Method PUT [PHP]

Der vom Browser (User Agent, HTTP Client) bei einem PUT oder POST gesendetet Enctype ist in HTTP der Content-Type und dieser legt fest, wie der gesendete Message-Body und überhaupt der gesamte Request zu verarbeiten ist. Also ob z.B. eine SOAP-Message im Request gesendet wurde oder ob es sich um einen XML-HTTP-Request handelt. Oder ob ein JSON-String gesendet wurde der eine ganz bestimmte Verarbeitung erfordert. Die in PHP üblichen Arrays $_GET, $_POST und $_REQUEST bleiben bei derartigen Erweiterungen in meinem Framework unverändert. Vielmehr bekommt das Request/Responseobjekt eine Methode zum Abfragen der für die serverseitige Aktion relevanten Schlüsselparameter.

Enctype application/body+query

Dieser neue Enctype ist für Uploads gedacht, wobei die gesendeten Dateien ihrerseits wiederum einen beliebigen Content-Type beinhalten können, z.B. eine XML-Datei. Der PUT-Request sendet also seinerseits den Enctype application/body+query für die Übertragung einer Datei von Type text/xml.

Erläuterungen

Clientseitig/JavaScript

Zunächst das Script im Bowser:



Für den Request mit dem beschriebenen Enctype ist an den URL ein QueryString anzuhängen, dies erfolgt über ein URLSearchParams()-Objekt und dem Aufruf der append()-Methode. Danach wird der Request eröffnet mit dem erzeugten QueryString. Des Weiteren wird auch der für den Request-Enctype vorgesehene Content-Type: application/body+query Header gesetzt. Schließlich wird der PUT-Request mit dem Inhalt der textarea als HTTP-Message-Body gesendet.

Serverseitig/PHP

Der serverseitige CODE für den Ablauf unter dem Schlüsselparameter xml sieht so aus:

if( $this->param('xml') ){
    $p = xml_parser_create();
    xml_parse_into_struct($p, $this->CGI->BODY, $vals, $index);
    $result = array();
    foreach($index['NAME'] as $i => $k){
        array_push($result, $vals[$k]);
    }
    $this->CONTENT = json_encode($result,1);
}

Währenddem also die Schlüsselparameter für die Ablaufsteuerung (serverseitige Parameter-Kontrollstruktur) als QueryString dem URL anhängig sind, befindet sich der gesendete HTTP-MessageBody in $this->CGI->BODY was dem XML-Parser übergeben wird. XML wird geparst und das erhaltene Array als JSON zurück an den Browser gesendet.

Idealer Enctype für Request-Method PUT

Der hier vorgestellte Enctype bzw. Content-Type: application/body+query eignet sich hervorragend für Uploads mittels Request-Method PUT. Der Grund hierfür ist die Trennung der zu übertragenden Datei von der Parameterliste. Während die Datei bytegenau im HTTP-Message-Body gesendet wird, befindet sich die Parameterliste im URL als angehängter QueryString.

FileUpload mit PUT

Bitte wählen Sie eine Datei um deren Eigenschaften auszugeben:

Ein Upload findet nicht statt, ist jedoch über den hier vorgestellten Enctype sehr einfach zu realisieren. Dabei werden die Eigenschaften der Datei als QueryString erzeugt und die Datei selbst im HTTP-Message-Body via PUT gesendet. Bei Uploads dieser Art entfällt das serverseitige Parsen, denn die hochgeladene Datei kann direkt und ohne Umschweife aus php://input gelesen werden.


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