NAME WWW::MLite - Lite Web Application Framework VERSION Version 2.01 SYNOPSIS package MyApp; use base qw/WWW::MLite/; use HTTP::Status qw/:constants/; use Data::Dumper; __PACKAGE__->register_method( # GET /myapp name => "getIndex", description => "Index page", method => "GET", path => "/myapp", deep => 0, attrs => { foo => 'blah-blah-blah', bar => 'on', deserialize => 0, serialize => 1, }, requires => undef, returns => undef, code => sub { my $self = shift; my @params = @_; $self->data(Dumper({ params => [@params], name => $self->name, description => $self->info("description"), attrs => $self->info("attrs"), path => $self->info("path"), method => $self->info("method"), requires => $self->info("requires"), returns => $self->info("returns"), })); return HTTP_OK; # HTTP RC }); 1; package main; use FindBin qw/$Bin/; use lib "$Bin/../lib"; use CGI; use File::Spec; my $q = new CGI; my $server = MyApp->new( project => "MyApp", ident => "myapp", root => File::Spec->catdir($Bin, "conf"), #confopts => {... Config::General options ...}, configfile => File::Spec->catfile($Bin, "conf", "myapp.conf"), log => "on", logfd => fileno(STDERR), #logfile => '/path/to/log/file.log', nph => 0, # NPH (no-parsed-header) ); print $server->call($q->request_method, $q->request_uri, $q) or die($server->error); DESCRIPTION Lite Web Application Framework This module allows you to quickly and easily write a REST servers new my $server = MyApp->new( project => "MyApp", ident => "myapp", root => File::Spec->catdir($Bin, "conf"), #confopts => {... Config::General options ...}, configfile => File::Spec->catfile($Bin, "conf", "myapp.conf"), log => "on", logfd => fileno(STDERR), #logfile => '/path/to/log/file.log', nph => 0, # NPH (no-parsed-header) ); Returns CTK object as WWW::MLite server confopts Optional value. Config::General options configfile File of configuration Default: /etc/myapp/myapp.conf log General switch for logging enable/disable Default: off Also see configuration for logging manage logfd File descriptor or fileno Default: none (use syslog) See IO::Handle logfile Log file path. Not recommended! nph Enable or disable NPH mode (no-parsed-header) Default: 0 See "USING-NPH-SCRIPTS" in CGI This option for the response subroutine only! root Root directory for project. This is NOT document root directory! Default: /etc/myapp See also CTK and CTK::App METHODS List of available methods call See "call_method" call_method $server->call_method( $ENV{REQUEST_URI}, $ENV{REQUEST_METHOD}, ... ); Runs the callback function from current method with additional parameters Note: any number of parameters can be specified, all of them will be receive in the callback function and in your overridden the response subroutine Returns: response content check_http_method $server->check_http_method("GET"); # returns 1 $server->check_http_method("OPTIONS"); # returns 0 Checks the availability of the HTTP method by its name and returns the status code my $code = $server->code; my $code = $server->code( 500 ); Gets/Sets response HTTP code Default: 200 (HTTP_OK) See HTTP::Status cleanup $server->cleanup; Cleans the all working data and resets it to default values data my $data = $server->data; $server->data({ param1 => "new value", }); Gets/Sets working data structure or HTTP content Default: undef See HTTP::Response head my $head = $server->head; $server->head({ "Content-Type" => "text/plain", }); Gets/Sets HTTP headers Default: "text/plain" See HTTP::Headers info my $info = $server->info; my $description => $server->info("description"); my $attrs = $server->info("attrs"); my $path = $server->info("path"); my $method = $server>info("method"); my $requires = $server->info("requires"); my $returns = $server->info("returns"); Returns the info structure or info-data of current method lookup_method my $method = $server->lookup_method($ENV{REQUEST_URI}, $ENV{REQUEST_METHOD}); Returns $method structure from hash of registered methods; or undef if method is not registered message my $message = $server->message; my $message = $server->message( "Internal Server Error" ); Gets/Sets response HTTP message Default: "OK" See HTTP::Status name my $name = $server->name; Returns name of current method. Default: default register_method use base qw/WWW::MLite/; use HTTP::Status qw/:constants/; use Data::Dumper; __PACKAGE__->register_method( # GET /myapp name => "getIndex", description => "Index page", method => "GET", path => "/myapp", deep => 0, attrs => { foo => 'blah-blah-blah', bar => 'on', deserialize => 0, serialize => 1, }, requires => [ qw/ user1 user2 userX / ], returns => { type => 'any', }, code => sub { my $self = shift; my @params = @_; # ... your method's code here ... return HTTP_OK; # HTTP RC }); Registers new method and returns operation status NOTE! This is non class method! attrs Sets attributes of the method as hashref Default: {} In the method's code or response method, you can get the attribute values using the $self->info("attrs") method code Sets callback function Default: sub { return HTTP::Status::HTTP_OK } This callback function MUST return HTTP status code See HTTP::Status deep, depth Enables deeply scanning of path for method lookup. If this param is set to true then the mechanism of the deeply lookuping will be enabled. For example: For registered path /foo with enabled deep lookuping will be matched any another incoming path that begins from /foo prefix: /foo, /foo/bar, /foo/bar/baz and etc. Default: 0 description Sets the description of method Default: none name Sets the name of method Default: default method Sets the HTTP method for trapping. Supported: GET, POST, PUT, DELETE. Default: GET path Sets the URL's path for trapping Default: / requires Array-ref structure that contains list of groups/users or any data for authorization Default: [] returns Hash-ref structure that contains schema Default: {} See JSON::Schema, JSON::Validator, http://json-schema.org/ middleware The middleware method. Runs before every Your registered methods. You can override this method in Your class. This method MUST returns HTTP status code. If code is a Successful status code (2xx) then Your registered method will called For examle: sub response { my $self = shift; my @params = @_; # . . . return HTTP::Status::HTTP_OK } response The method for response prepare. You can override this method in Your class. But note! This method MUST returns serialized or plain content for output For examle: sub response { my $self = shift; my @params = @_; my $rc = $self->code; # RC HTTP code (from yuor methods) my $head = $self->head; # HTTP Headers (hashref) my $data = $self->data; # The working data my $msg = $self->message || HTTP::Status::status_message($rc) || "Unknown code"; # . . . my @res = (sprintf("Status: %s %s", $rc, $msg)); push @res, sprintf("Content-Type: %s", "text/plain; charset=utf-8"); push @res, "", $data // ""; return join("\015\012", @res); } again Internal use only! See "again" in CTK::App EXAMPLES See all examples on METACPAN website https://metacpan.org/release/WWW-MLite HISTORY See Changes file TO DO See TODO file BUGS * none noted Please report any bugs to https://rt.cpan.org/. SEE ALSO CTK, HTTP::Message AUTHOR Serż Minus (Sergey Lepenkov) http://www.serzik.com COPYRIGHT Copyright (C) 1998-2019 D&D Corporation. All Rights Reserved LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See LICENSE file and https://dev.perl.org/licenses/