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

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. Die Response beeinhaltet ein als JSON kodiertes Array was per AJAX-Callback in das Template, die Liste mit Namen, gerendert wird.

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

Uploads sind ü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.

Rest, XMLRPC und SOAP

Webanwendungen die in einem Framework laufen, wollen natürlich auch die Vorzüge eines Framework nutzen ohne daß man für den Ablauf eines HTTP-Request-Response-Zyklus für Webservices jedesmal einen dedizierten CODE schreiben will. Denn der Ablauf ist ja bei jedem Request immer derselbe, nur die Antwortseiten und die serverseitigen Aktionen sind unterschiedlich. Damit diese Unterscheidungen gemacht werden können, dafür sendet ein HTTP-Client einen Content-Type und dieser schreibt vor, wie ein Request zu verarbeiten ist. So ist die Frage der Erweiterung auf o.g. Webservices nur eine Frage der Erweiterung des Parsers, welcher die Request-Parameter ermittelt. Letztere steuern dann den Ablauf innerhalb der an den URL gebundenen Klasse. Um dies zu demonstrieren, wird hiermit die Serverumgebung ausgegeben.

Enctype application/json

Auch um diesen Enctype ist der Parser erweitert. Um das mal zu zeigen, mit einem Klick auf wird das Objekt window.document als JSON serialisiert per AJAX zum Server gesendet und zurückgeschickt. Das Ergebnis sehen Sie untenstehend, einschließlich JS-Code:

URL und Klassenbindung

Die per statische Routingtable an diesen URL gebundene Klasse lautet class = ContentType und kann hier eingesehen werden. Diese Klasse ist ein Beispiel dafür, wie mein Framework mit unterschiedlichen, im Request gesendeten, Content-Types umgeht und natürlich auch beliebige Content-Types senden kann in einer Response. Aufgrund transparenter Layer und klar definierten Schnittstellen erscheint der im Request gesendete Content-Type nämlich nicht in der Parameter-Kontrollstruktur, genausowenig wie die Requestmethode..

Fehlerbehandlung

Für das ganze Framework ist ein Errorhandler gesetzt:

set_error_handler( function($errno, $errstr, $errfile, $errline){
    ob_get_clean();
    header("HTTP/1.1 502");
    header("Expires: Thu, 01 Jan 1970 00:00:00 GMT");
    header("Content-Type: text/plain");
    echo $errstr;
    die();
}, E_ALL|E_STRICT);

So liefert die alleinige Verwendung des Parameters /ctype.htm?xml=1 einen Fehler welcher über obenstehenden ErrorHandler abgefangen wird. Ein Fehler im Request ist es deswegen, weil unter diesem Schlüsselparameter ein HTTP-Message-Body mit XML erwartet wird und ein Solcher ist bei einem GET-Request bekanntlich nicht vorhanden. Die Fehlermeldung selbst jedoch erzeugt der in PHP eingebaute Parser.

Die Klasse als Objekt in HTML eingebunden


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 Erweiterung des PHP Parsers um neue Enctypes im HTTP-Request


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