The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

MojoX::Dispatcher::Qooxdoo::Jsonrpc - Dispatcher for Qooxdoo Json Rpc Calls

SYNOPSIS

 # lib/your-application.pm
 sub startup {
    my $self = shift;

    # choose your directory for services:
    use lib ('qooxdoo-services'); 
    
    # use all services you want to use
    # (and omit everything you don't want to expose)
    use Test;
    
    # instantiate all services
    my $services= {
        Test => new Test(),
        
    };
    
    
    # add a route to the Qooxdoo dispatcher and route to it
    my $r = $self->routes;
    $r->route('/qooxdoo') ->
            to('
                Jsonrpc#handle_request', 
                services => $services, 
                namespace => 'MojoX::Dispatcher::Qooxdoo'
            );
        
 }

    

DESCRIPTION

MojoX::Dispatcher::Qooxdoo::Jsonrpc dispatches incoming rpc requests from a qooxdoo application to your services and renders a (hopefully) valid json reply.

EXAMPLE

This example exposes a service named "Test" in a folder "qooxdoo-services". The Mojo application is named "qooxdooserver". First create this application using "mojolicious generate app qooxdooserver".

Then, lets write the service:

Change to the root directory "qooxdooserver" of your fresh Mojo-Application and make a dir named 'qooxdoo-services' for the services you want to expose.

Our "Test"-service could look like:

 package Test;

 sub new{
    my $class = shift;
    
    my $object = {
        
    };
    bless $object, $class;
    return $object;
 }

 sub add{
    my $self = shift;
    my @params = @_;
    
    # Debug message on Mojo-server console (or log)
    print "Debug: $params[0] + $params[1]\n";
    
    # uncomment if you want to die without further handling
    # die;
    
    # uncomment if you want to die with a message in a hash
    # die {code => 20, message => "Test died on purpose :-)"};
    
    
    # uncomment if you want to die with your homemade error object 
    # (simple example see below)
    # better use your elaborate error handling instead!
    
    # require Error;
    # my $error = new Error();
    # die $error;
    
    my $result =  $params[0] + $params[1]
    return $result;
    
 }

 1;
 
 
 # Example of simple and stupid Error class:
 
 package Error;

 sub new{
    my $class = shift;
    
    my $error = {};
    
    bless $error, $class;
    return $error;
 }

 sub message{
    return "stupid error message";
 }

 sub code{
    return "934857"; # no real error code here
 }

1;

Please create a constructor (like "new" here) which instantiates an object because we are going to use this in our 'lib/qooxdooserver.pm' below.

Notice the exception handling: You can die without or with a message (see example above). MojoX::Dispatcher::Qooxdoo::Jsonrpc will catch the "die" like an exception an send a message to the client. Happy dying! :-)

Now, lets write our application. Almost everything should have been prepared by Mojo when you invoked "mojolicious generate app qooxdooserver" (see above).

Change to "lib/" and open "qooxdooserver.pm" in your favourite editor. Then add some lines to make it look like this:

 package qooxdooserver;

 # perhaps this is wise for a server..
 use strict;
 use warnings;

 use base 'Mojolicious';

 # This method will run once at server start
 sub startup {
    my $self = shift;
    
    # use your services' directory
    use lib ('qooxdoo-services');
    
    # use our Test service
    use Test;
    
    # instantiate objects
    my $services= {
        Test => new Test(),
        
        # add more constructors of services here..
    };
    
    # tell Mojo about your services:
   
    my $r = $self->routes;
    
    # this sends all requests for "/qooxdoo" in your Mojo server to our little dispatcher
    # change this at your own taste.
    $r->route('/qooxdoo')->to('
        jsonrpc#handle_request', 
        services => $services, 
        namespace => 'MojoX::Dispatcher::Qooxdoo'
    );
 }

 1;

AUTHOR

Matthias Bloch, <lt>matthias at puffin ch<gt> This Module is sponsored by OETIKER+PARTNER AG

COPYRIGHT AND LICENSE

Copyright (C) 2010 by :m)

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.