2009-06-24 52 views
3

我正在使用Apache和Perl(modperl),处理程序处理请求。我对此很陌生,我不太清楚如何以合理的方式处理事情。Perl REST流程布局

现在,我有以下几点:

package MyClass::Handler; 

use warnings; 
use strict; 
# includes 

our %action = ( 
    'a' => \&a, 
    # And more 
); 

sub handler { 
    my $a = shift; 
    my $r = Apache2::Request->new($a); 

    # Do things 

    return Apache2::Const::OK(); 
} 

我应该有一个不同的文件为每个“空间”?使用stackoverflow作为模板,我是否需要一个User.pm用于所有用户管理? Story.pm的故事?

回答

6

您可能会对CPAN出色的CGI::Application框架感兴趣。尽管它的名字,它在正常的CGI和mod_perl下都可以使用。它旨在使设置Web应用程序调度表的任务变得非常简单。扔在CGI::Application::Dispatch,你会得到很好的类似REST的URL。

+0

谢谢,我正在努力学习它一点点。我将如何布置应用程序的其余部分? – Timmy 2009-06-24 21:23:32

2

对于最近的项目,我编写了一个自定义配置处理程序,它实现了一个新的ResourceURI配置设置。这让我把配置行到httpd.conf中这样的:

ResourceURI SomeResource GET,POST,DELETE "^/...$" 

三个参数是我的资源类的名字,它的资源可以响应HTTP方法列表中,并且该URI匹配的正则表达式(S )为资源。

自定义配置类取代这些线与这样的块:

PerlModule Handler::{resource class} 
PerlModule Resource::{resource class} 

<Location ~ "{uri regex}"> 
    Order allow,deny 
    Allow from all 

    <LimitExcept {allowed methods}> 
     Order deny,allow 
     Deny from all 
    </LimitExcept> 

    SetHandler modperl 
    PerlHandler Handler 

    PerlSetVar Resource {resource class} 
</Location> 

这需要加载我的课的护理,让阿帕奇拒绝无效的方法,设置标志,以表明其资源路线,并通过Handler :: handler()函数传递所有请求。

package Handler; 

sub handler { 
    my $r = shift; 
    my $resource_class = 'Resource::' . $r->dir_config('Resource'); 
    my $handler_class = 'Handler::' . $r->dir_config('Resource'); 
    my $resource = $resource_class->new($r, $r->uri); 
    return Apache2::Const::HTTP_NOT_FOUND unless $resource; 
    my $method = $r->method(); 
    return Apache2::Const::HTTP_NOT_IMPLEMENTED 
     unless $handler_class->can($method); 
    return $handler_class->$method($r, $resource); 
} 

现在,你只需要实现资源:: *类与资源的逻辑(包括如何格式化表示),处理器:: *类与方法命名为GET,HEAD,POST等,并让他们使用$ r和$ resource来处理请求。

对于您需要的每个新资源,添加一行配置,实现一个Handler类(我发现它通常可以是一个从通用基类继承的几乎空模块),并实现一个Resource类,其中包含大部分代码。我还发现,我经常需要在处理对另一个资源的请求的上下文中创建一个资源对象;这就是为什么我的资源构造函数为uri单独提供一个参数,而不是从$ r获取uri。如果我在Resource :: Foo中并且需要一个Resource :: Bar对象,我可以说我的$ bar = Resource :: Bar-> new($ r,'/ bars/1234');它使用客户端将使用的相同URI创建Bar对象。