[Catalyst] Mapping parameters for web services

Bill Moseley moseley at hank.org
Mon Oct 22 23:20:09 GMT 2007

I'm looking for suggestions how to best map XMLRPC request parameters into
the params and arguments that my existing (web) controllers are

I have a number of controllers that I'd like to expose for web
services.  The C::P::Server::XMLRPC plugin makes this easy since one
can add :XMLRPC to any existing controller to expose it.

My controllers tend to be thin -- that is they don't fetch every bit
of data that the View might display.  Some of that work is left to the
templates.  So, for XMLRPC I also have a separate View that prepares
any data needed for the response.  This view is called instead for
XMLRPC requests.

Frankly, feels a bit dirty but I'm doing basically:

    sub process {
        my ( $self, $c ) = @_;
        my $method = $c->action->reverse;
        $method =~ s[/][_]g;
        $self->$method( $c ) if $self->can( $method );

So, I can add a method to this view for any controller that needs
extra help preparing the XMLRPC response.

So, on to my question:

The parameters and arguments that come in on web requests are
different than they come in for XMLRPC  requests -- so I need to "map"
the arguments from the XMLRPC request into the arguments and
parameters as the existing controllers expect.

So, my question is *where* to do that?  It's application-specific
so seems like something that should happen in auto().

As above, there's the View system to prepare the response.  Should I just
cheat and abuse it on requests as well?  That is:

    sub auto : Private {
        my ( $self, $c ) = @_;
        $c->forward( $c->view( 'XMLRPC::Input' ) ) if $c->is_xmlrcp;
        return 1;

And then that "view" would adjust the request arguments and parameters
as needed.

What approach is recommended to map (filter?) the request based on the

Bill Moseley
moseley at hank.org

More information about the Catalyst mailing list