AJAX-Alternative zu XML oder JSON in Response

Parse einen in der Response gesendeten QUERY_STRING vom Type application/x-www-form-urlencoded mit JavaScript

Nach der aktuellen XHR-Spezifikation kann der mit der Response empfangene Datentype mit xhr.responseType = 'text'; beispielsweise festgelegt werden. Darüber hinaus sendet aber auch der serverseitige Prozess einen Response-Header mit der Angabe eines bestimmten Content-Type. Betrachte das Stück CODE untenstehend:

    var xhr = new XMLHttpRequest();
    xhr.open('PUT', '/queryparse.html', true);
    xhr.onload = function(e){
        console.log(e.target.getResponseHeader('Content-Type'));
                   /* xhr  */
    }
    xhr.send('asdf');

Das zeigt, wie dieser Response-Header in der Callback-Funktion ermittelt werden kann. Abhängig vom Wert dieses Headers kann nun clientseitig der Parser aufgerufen werden, der genau für diesen Content-Type bestimmt ist. Mit diesem Content-Type ergeben sich Schlüssel-Werte-Paare, wobei die Werte mehrerer gleichnmamiger Schlüssel ein Array ergeben. Untenstehend eine erprobte Funktion zum Parsen eines QUERY_STRING:

    function qparse(query){
        var param = {};
        var pairs = query.split(';');
        for (var i = 0; i < pairs.length; ++i){
            var [key, val] = pairs[i].split("=");
            param[key] = param[key] ? param[key] : [];
            param[key].push(decodeURIComponent(val));
        }
        return param;
    }

Eine zu diesen Algorihmus passende Datenstruktur sieht so aus:

    $struct = {
        foo   => 'asdf',
        bar   => 123,
        names => ['foo','bar','boo']
    };

was sehr vielen Anforderungen Genüge tut.

Enctype application/x-www-form-urlencoded und Prozentkodierung

Zum Erzeugen eines solchen Enctypes gibt es in PHP eine Elementarfuntion:

$q = http_build_query( array(
    'foo[a]'  => 123,
    'foo[b]'  => 'bar',
    'name' => 'boo',
    'amt'  => '€ 2.59'
) );

$res = array();
parse_str ( $q, &$res );

echo $q, print_r($res,1);

foo%5Ba%5D=123&foo%5Bb%5D=bar&name=boo&amt=%E2%82%AC+2.59
Array
(
    [foo] => Array
        (
            [a] => 123
            [b] => bar
        )

    [name] => boo
    [amt] => € 2.59
)


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. s​os­@rolf­rost.de.