Thread CGI Alternative (6 answers)
Opened by janus at 2016-02-19 13:34

guest janus
 2016-02-19 13:34
#183934 #183934
Die in CGI.pm verbaute Logik passt nicht immer. Des Weiteren strebte ich eine Abstraktion der Layer an, grundsätzlich soll meine Framework-Instanz unabhängig vom gesendeten Content-Type eine einheitliche Methode $self->param('name') anwenden können ohne dass im Controller der Name des Layers (XML, JSON usw.) überhaupt namentlich auftaucht.

Unabhängig von Request-Method soll der Verpackungs-Layer entsprechend des im Request-Header gesendeten Content-Type automatisch geladen werden. Untenstehend ein Auszug aus meiner Klasse, der Code ist beliebig erweiterbar:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# hier werden die jeweiligen Layer geladen
sub _parse_rawdata{
    my $self = shift;
    if(    $self->{CONTENT_TYPE} eq 'multipart/c-eav' ){
        require cEAV;
        $self->{eav} = cEAV->decode_eav( $self->rawdata );
        $self->{param} = $self->{eav}->{param};
    }
    elsif( $self->{CONTENT_TYPE} eq 'multipart/eav' ){
        # coming soon
    }
    elsif( $self->{CONTENT_TYPE} eq 'multipart/form-data' ){
        require ParseMultipart;
        $self->{STDIN}->seek(0,0);
        $self->{param} = ParseMultipart->parse_multipart( $self->{STDIN} );
    }
    elsif( $self->{CONTENT_TYPE} eq 'application/json' ){
        require JSON;
        my $json = JSON->new;
        $self->{json} = $json->decode($self->rawdata);
        $self->{param} = $self->{json}{param};
    }
    elsif( $self->{CONTENT_TYPE} eq 'bserialize/av' ){
        require bSerialize;
        my $bs = bSerialize->new;
        my $binary = $self->rawdata;
        $self->{param} = $bs->bin2av( \$binary );
    }
    else{
        # Default Enctype
        # Parameter: Name => [Value], application/x-www-form-urlencoded
        $self->{param} = $self->qparse($self->rawdata);
    }
}


Nur malso als Anregung. Das Teil bewährt sich bereits seit einiger Zeit auf mehreren produktiven Domänen und einer nahtlosen Integration von XMLRPC, SOAP , Rest u.a. Webservices steht nichts mehr im Wege bei gleichzeitiger extremen Vereinfachung und Code-Reduzierung.

Die XMLRPC Klasse serverseitig sieht z.B. so aus, ihr könnt das gerne mal vergleichen mit dem was Wordpress-Entwicker veranstalten. Zusammen mit einen Kommandozeilen-FW ist die Qualitätssicherung multipler Domänen kein Thema mehr, Remote wird auf die komplette Konfiguration/Content zugegriffen und das ganze ist natürlich automatisierbar.

Schönes Wochenende ;)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        # Deserialisierung, Rückgewinnung der Datenstruktur
        # für den wahlfreien Zugriff: Schlüssel-Werte-Paare
        $self->param;
        my $in = $self->{CGI}{param};
        
        my $code = delete $in->{code};
        eval $code or die "Error Compile Code: $@\n";

        my $methodname = delete $in->{methodname};
        my $coderef = $self->can($methodname) 
            or die "Unknown methodname '$methodname'\n";

        # Mit in %$in verbleibenden Parametern
        # wird die namentlich übergebene Methode aufgerufen
        $self->{CONTENT} = $self->$coderef(%$in) || die "the return value is emty";

Last edited: 2016-02-19 13:53:29 +0100 (CET)

View full thread CGI Alternative