2009-06-24 51 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對象。