diff --git a/Changes.md b/Changes.md index 203ee3e..0d2c3b8 100644 --- a/Changes.md +++ b/Changes.md @@ -8,6 +8,7 @@ Not yet released: v0.03-beta - Fixed an issue with WebPerl::JSObject::toperl() where JS objects were not being converted properly. +- Added AJAX demo - ... diff --git a/web/webperl.psgi b/web/webperl.psgi index 89accec..3fca524 100644 --- a/web/webperl.psgi +++ b/web/webperl.psgi @@ -1,10 +1,11 @@ #!/usr/bin/env perl use warnings; -use 5.0.26; +use strict; use FindBin; use Plack::MIME; use Plack::Builder qw/builder enable mount/; use Plack::App::Directory (); +use Cpanel::JSON::XS qw/decode_json encode_json/; # Demo Plack server for WebPerl # run me with "plackup webperl.psgi" @@ -21,11 +22,30 @@ Plack::MIME->add_type(".wasm" => "application/wasm"); my $SERV_ROOT = $FindBin::Bin; +my $app_ajaxtest = sub { + my $req = Plack::Request->new(shift); + my $rv = eval { + my $content = decode_json( $req->content ); + + # We can do anything we like here, like e.g. call Perl subs, + # read/write files on the server, etc. - for this demo we're + # just going to munge some data from the request. + $content->{hello} .= "The server says hello!\n"; + + $content; # return value from eval (must be a true value) + }; my $e = $@||'unknown error'; + my $res = $req->new_response($rv ? 200 : 500); + $res->content_type($rv ? 'application/json' : 'text/plain'); + $res->body($rv ? encode_json($rv) : 'Server Error: '.$e); + return $res->finalize; +}; + builder { enable 'SimpleLogger'; enable 'Static', path => qr/\.(?:html?|js|css|data|mem|wasm|pl)\z/i, root => $SERV_ROOT; - Plack::App::Directory->new({root=>$SERV_ROOT})->to_app; + mount '/' => Plack::App::Directory->new({root=>$SERV_ROOT})->to_app; + mount '/ajaxtest' => $app_ajaxtest; } diff --git a/web/webperl_demo.html b/web/webperl_demo.html index 325d739..8b7c380 100644 --- a/web/webperl_demo.html +++ b/web/webperl_demo.html @@ -54,6 +54,22 @@ $btn->click(sub { print "You clicked the jQuery button!\n"; } ); $btn->appendTo( $jq->('#buttons') ); + +# And a demo of AJAX using jQuery: +use Cpanel::JSON::XS qw/encode_json/; +use Data::Dumper; +my $data_out = { hello => "Hello, World!\n" }; +$jq->ajax( '/ajaxtest', { + method => 'POST', # we're sending JSON in the POST body + data => encode_json($data_out), +} )->done( sub { + my $data_in = shift; + print "AJAX Success! Data: ", Dumper($data_in->toperl); +} )->fail( sub { + my ($jqXHR, $textStatus, $errorThrown) = @_; + print "AJAX Failed! ($errorThrown)\n"; +} ); +