我正在尝试在Perl中实现RESTful API.我目前的想法是简单地用正则表达式解析path_info,然后将请求分派给适当的子例程,然后该子例程将为请求的资源吐出JSON,XML甚至XHTML.
例如,要检索有关用户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块会变得非常大.
期待听到您的意见,以使这些代码更好.
对于轻量级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;
我会使用类似CGI :: Application :: Dispatch的东西,它允许我使用变量和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-app控制器类方法中的类).
CGI :: Application还附带插件,用于输出从模板生成的XML,JSON或文本.
cgi-app(和c :: a :: d)是CGI应用程序,可以在CGI,FastCGI或mod_perl下使用(很少或没有).C :: A :: D也是默认的mod_perl PerlHandler.