2009-08-11 172 views
7

我想在Perl中實現一個RESTful API。我目前的想法是簡單地用正則表達式解析path_info,然後將請求發送到適當的子程序,然後將該子程序吐出JSON,XML甚至XHTML以獲取請求的資源。如何在Perl中實現RESTful API?

例如檢索關於用戶1234信息的RESTful客戶端應該找到它:

http://example.com/model.pl/users/1234

下面是我第一次嘗試在實現RESTful API框架代碼:

model.pl

#!/usr/bin/perl -w 
use strict; 
use CGI; 

my $q = CGI->new(); 

print $q->header('text/html'); 

my $restfuluri = $q->path_info; 

if  ($restfuluri =~ /^\/(questions)\/([1-9]+$)/) { questions($1, $2); } 
elsif ($restfuluri =~ /^\/(users)\/([1-9]+$)/)  { users($1, $2); } 


sub questions 
{ 
     my $object = shift; 
     my $value = shift; 

     #This is a stub, spits out JSON or XML when implemented. 
     print $q->p("GET question : $object -> $value"); 
} 

sub users 
{ 
     my $object = shift; 
     my $value = shift; 

     #This is a stub, spits out JSON or XML when implemented. 
     print $q->p("GET user: $object -> $value"); 
} 

在我進一步討論之前,我想聽聽有經驗的Perl黑客是否有正確的基本想法,以及這種方法在性能方面是否存在嚴重缺陷。

我可以想象,一段時間後,if/else塊會變得非常大。

期待聽到您的意見,使此代碼更好。

+2

我可以建議,如果你的目標是建立你花更多的時間來學習REST一個RESTful API 。 RESTful接口並不是使用漂亮的URL來傳遞XML和JSCON。 – 2009-08-11 13:03:19

+0

查看詳細解釋REST的StackOverflow的其他問題。 – aehlke 2009-08-11 14:18:37

+0

請不要誤解我的意思,我知道REST是什麼,我意識到REST的使用和濫用。我只需要爲遺留應用程序提供RESTful API的快速和骯髒的方式。它有一個完善的數據層,我需要做的就是允許人們使用漂亮的URI訪問格式爲JSON或XML的數據。我維護的東西必須比性感更可靠。我已經開始閱讀RESTful Web服務O'Reilly的書籍和Brian的大部分書籍,甚至提出要求。我認爲這是一個合法的問題。此外,大部分討論都談論Ruby。謝謝。 – GeneQ 2009-08-11 15:11:46

回答

6

我會使用類似CGI ::應用::調度,它允許我使用變量和REST方法構建一個調度表,並且可以使用CPAN中的CGI和CGI :: Application模塊。例如:

table => [ 
'/questions/:id[get]' => { rm => 'get_question' }, 
'/users/:id[get]'  => { rm => 'get_user' }, # OR 
':app/:id[post]'   => { rm => 'update' }, # where :app is your cgi application module 
':app/:id[delete]'  => { rm => 'delete' }, 
], 

(或者可以使用auto_rest或auto_rest_lc)

你可以使用一個單獨的CGI :: Application類爲每種類型的事物(或只使用類在你的cgi-應用程序控制器類的方法)。

CGI ::應用程序還附帶了用於輸出XML,JSON或從模板生成的文本的插件。 cgi-app(和c :: a :: d)是CGI應用程序,可以在CGI,FastCGI或mod_perl下使用(很少或不)。 C :: A :: D默認也是一個mod_perl PerlHandler。

+0

正是我需要的。謝謝。 – GeneQ 2009-08-11 15:48:44

-2
+0

如果你使用apache和mod_rewrite,爲什麼甚至包含.pl?你也失去了身份證。你可以用mod_rewrite重寫URL,或者創建一個mod_perl處理程序,並使用它來處理/ dir /任何。 CGI :: Application :: Dispatch是一個mod_perl處理程序,可以休息。 – MkV 2009-08-11 14:11:44

1

我使用CatalystCatalyst::Controller::REST構建應用程序

+0

謝謝。但我會通過。沒有任何反對催化劑,這是提供一個RESTful接口到一個(非常)遺留應用程序。快速和骯髒的東西。 ;-) – GeneQ 2009-08-11 15:03:34

15

對於輕量級REST API,我會看看Mojolicious。請求路由非常簡單,內置的JSON渲染器和用戶代理根據我的經驗開發簡單的REST API非常簡單。

如果您的應用程序將會比較小,那麼Mojo::Lite可能會滿足您的要求。例如,你可能能夠做這樣的事情:

use Mojolicious::Lite; 

get '/questions/(:question_id)' => sub { 
    my $self = shift; 
    my $result = {}; 
    # do stuff with $result based on $self->stash('question_id') 
    return $self->render_json($result) 
} 

app->start; 
1

簡單的解決方案:

use CGI; 

my $page = new CGI; 

if($ENV{ 'REQUEST_METHOD' } eq 'GET'){ 

    my $data = <<json; 
    { 
    "isbn" : "123456", 
    "title" : "Programming Perl", 
    "author" : "L. Wall" 
    } 
json 

    print $page->header('application/json'); 

    print $data; 
} 
+0

因爲您的示例中的here-document由於間距不起作用,例如 – Jinxed 2016-03-16 14:16:10

+0

對不起!我糾正它。 – Gerd 2016-04-19 06:57:58