Thread CGI Alternative
(6 answers)
Opened by janus at 2016-02-19 13:34
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) |