Perl的REST流布局(Perl REST flow layout)

2019-07-29 06:03发布

我使用的Apache和Perl(modperl来),与处理程序来处理请求。 我是新来这个,我不太清楚如何打好东西出来一个明智的方式。

现在,我有以下几点:

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();
}

我应该为每个“空间”不同的文件? 使用计算器为模板,我需要为所有的用户管理User.pm? 一种故事Story.pm?

Answer 1:

你可能会感兴趣的优秀CGI ::应用从CPAN框架。 尽管它的名字,它的工作原理都在正常CGI和mod_perl的。 它的设计,使建立web应用分派表很简单的任务。 在投掷CGI ::应用::派遣 ,你会得到很好的REST样的URL。



Answer 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>

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

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 $和资源来处理请求。

对于需要每一个新的资源,您添加配置的一条线,实现一个Handler类(其中我发现往往是一个几乎空模块从通用基类继承),并实现其包含大量的一个资源类码。 我还发现,我经常需要创建在处理另一个资源的请求上下文一个资源对象; 这就是为什么我的资源建设者采取的URI一个单独的参数,而不是刚刚从$ R的URI。 如果我在资源:: Foo和我需要一个资源:: Bar对象,我可以说我的$栏=资源::酒吧,>新($ R,“/酒吧/ 1234”); 它创建使用相同的URI,一个客户端将使用Bar对象。



文章来源: Perl REST flow layout