å ã®èšäºã¯ãã¡ãã
PSGI / Plackã«é¢ããèšäºã®ç¶ãã Plack :: Builderãããã³Plack ::ããã«ãŠã§ã¢ããã詳现ã«æ€èšããŸãã
ååã®èšäºã§ã¯ãPSGIä»æ§ããããã©ã®ããã«è¡šç€ºãããã®ãããªã䜿çšãã¹ããªã®ããèŠãŸããã PSGIã®å®è£ ã§ããPlackãšãã®äž»èŠã³ã³ããŒãã³ãã調æ»ããããã«å²ãåœãŠãããã¿ã¹ã¯ãå®è¡ããæãåçŽãªAPIãäœæããäž»ã«PSGIãµãŒããŒãç°¡åã«èª¿æ»ããŸããã
èšäºã®ç¬¬2éšã§ã¯ã次ã®ç¹ãèæ ®ããŸãã
- Plack :: Builderã¯åŒ·åãªã«ãŒã¿ãŒãªã©ã§ãã
- Plack ::ããã«ãŠã§ã¢-ãã¬ã€ã€ãŒãã䜿çšããŠæ©èœãæ¡åŒµããŸãã
äºååå²ãµãŒããŒã§ããStarmanãåŒãç¶ã䜿çšããŸãïŒäºåå®è¡ããã»ã¹ã®ã¢ãã«ã䜿çšããŸãïŒã
Plackã®è©³çŽ°:: Builder
åã®èšäºã§ãPlack :: Builderãç°¡åã«ã¬ãã¥ãŒããŸããã ä»ãããããã詳现ã«æ€èšããæãæ¥ãŸããã Plack :: BuilderãšPlack :: Middlewareãèæ ®ãã決å®ã¯ãéåžžã«å¯æ¥ã«çžäºæ¥ç¶ãããŠãããããéåžžã«è«ççã§ãã ç°ãªãèšäºã®ããã2ã€ã®ã³ã³ããŒãã³ããèæ ®ãããšãäž¡æ¹ã®èšäºã«çžäºåç §ãå«ãŸããããšã«ãªããŸããããã¯ããžã£ãŒãã«åœ¢åŒã§ã¯ããŸã䟿å©ã§ã¯ãããŸããã
Plack :: Builderã®åºæ¬æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
builder { mount '/foo' => builder { $bar }; }
ãã®æ§é ã¯ãPSGIã¢ããªã±ãŒã·ã§ã³ïŒ$ããŒïŒã/ fooã«é 眮ãããããšã瀺ããŠããŸãã ãã«ããŒã§ã©ãããããã®ã¯ãé¢æ°ãžã®åç §ã§ãªããã°ãªããŸãããããããªããšã次ã®åœ¢åŒã®ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
/usr/local/share/perl/5.14.2/Plack/App/URLMap.pmè¡71ã§ãstrict refsãã䜿çšãããŠããéãæååïŒãstupid stringãïŒããµãã«ãŒãã³åç §ãšããŠäœ¿çšã§ããŸããã
ã«ãŒãã¯ãããšãã°æ¬¡ã®ããã«ãã¹ãã§ããŸãã
builder { mount '/foo' => builder { mount '/bar' => builder { $bar; }; mount '/baz' => builder { $baz; }; mount '/' => builder { $foo; }; }; };
ãã®ãšã³ããªã¯ãã¢ããªã±ãŒã·ã§ã³$ fooãã¢ãã¬ã¹/ fooã«ãã¢ããªã±ãŒã·ã§ã³$ barãã¢ãã¬ã¹/ foo / barã«ãã¢ããªã±ãŒã·ã§ã³$ bazãã¢ãã¬ã¹/ foo / bazã«ããããé 眮ãããããšãæå³ããŸãã
ãã ããåã®ã¬ã³ãŒãã次ã®åœ¢åŒã§èšé²ããããšã誰ãæ°ã«ããŸããã
builder { mount '/foo/bar' => builder { $bar }; mount '/foo/baz' => builder { $baz }; mount '/foo/' => builder { $foo }; };
äž¡æ¹ã®ãšã³ããªã¯åçã§ãããåãã¿ã¹ã¯ãå®è¡ããŸãããæåã®ãšã³ããªã¯ããã·ã³ãã«ã§ããããããããã«èŠããŸãã Plack :: Builderã¯ãªããžã§ã¯ãæåã®ã¹ã¿ã€ã«ã§äœ¿çšã§ããŸãããå人çã«ã¯æç¶ãåã§äœ¿çšããããšã奜ã¿ãŸãã ãªããžã§ã¯ãæå圢åŒã®Plack :: Builderã®ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
my $builder = Plack::Builder->new; $builder->mount('/foo' => $foo_app); $builder->mount('/' => $root_app); $builder->to_app;
ãã®ãšã³ããªã¯æ¬¡ãšåçã§ãïŒ
builder { mount '/foo' => builder { $app; }; mount '/' => builder { $app2; }; };
ã©ã®æ¹æ³ã䜿çšãããã¯ãçŽç²ã«åã ã®åé¡ã§ãã Plack ::ããã«ãŠã§ã¢ã確èªããåŸãPlack :: Builderã«æ»ããŸãã
Plack ::ããã«ãŠã§ã¢
Plack ::ããã«ãŠã§ã¢ã¯ãCPANãã䜿ããããPSGIã¬ã€ã€ãŒããšèšãããã«ãæžãããã®åºæ¬ã¯ã©ã¹ã§ãã ããã¯äœã®ããã§ããïŒ ç¹å®ã®APIã®å®è£ äŸãæ€èšããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã次ã®ããã«ãªã£ãŠãããšæ³åããŠãã ããã
my $api_app = sub { my $env = shift; my $req = Plack::Request->new($env); my $res = $req->new_response(200); my $params = $req->parameters(); if ($params->{string} && $params->{string} eq 'data') { $res->body('ok'); } else { $res->body('not ok'); } return $res->finalize(); }; my $main_app = builder { mount "/" => builder { $api_app }; }
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯æ£åžžã«åäœããŸãããPOSTã¡ãœããã䜿çšããŠéä¿¡ãããå Žåã«ã®ã¿ããŒã¿ãåä¿¡ããå¿ èŠãçªç¶çãããšæ³åããŠãã ããã
ç°¡åãªè§£æ±ºçã¯ãã¢ããªã±ãŒã·ã§ã³ã次ã®åœ¢åŒã«ããããšã§ãã
my $api_app = sub { my $env = shift; my $req = Plack::Request->new($env); my $res = $req->new_response(200); my $params = $req->parameters(); if ($req->method() ne 'POST') { $res->status(403); $res->body('Method not allowed'); return $res->finalize(); } if ($params->{string} && $params->{string} eq 'data') { $res->body('ok'); } else { $res->body('not ok'); } return $res->finalize(); };
åé¡ã解決ããã®ã«4è¡ããããããŸããã§ããã ããã§ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããå¿ èŠããããPOSTã¡ãœããã«ãã£ãŠã®ã¿éä¿¡ãããããŒã¿ãåãå ¥ããå¿ èŠããããšæ³åããŠãã ããã ã©ãããïŒ ãã®æ¡ä»¶ãããããèšå ¥ããŸããïŒ ããã¯ãããã€ãã®çç±ã§ãªãã·ã§ã³ã§ã¯ãããŸããã
- ã³ãŒãã®éãå¢å ãããã®çµæããšã³ããããŒïŒåçŽãªæ¹ãè€éãªæ¹ãåªããŠããŸãïŒã
- ééããç¯ããããïŒäººçèŠå ïŒã
- ãããžã§ã¯ããå¥ã®ããã°ã©ããŒã«è²æž¡ãããšã圌ã¯äœããå¿ããŠäœãééã£ãããšãããå¯èœæ§ããããŸãïŒäººçèŠå ïŒã
ããã§ãåé¡ãå®åŒåããŸãã ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããã³ãŒããå€æŽããã«ç¹å®ã®ããããã£ãåæã«ååŸããããšã確èªã§ããŸããã ãããšãã§ããŸããïŒ
ããã«ãŠã§ã¢ãšã³ãžã³ã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã«ãšã³ãããŒãšã³ãã®æ©èœãæäŸããã®ã«æé©ã§ãã ãã¡ããã察çãå®æããããã°ã©ã å šäœã§æ¬åœã«å¿ èŠãªã³ãŒãã®ã¿ãè¿œå ããããšã¯äŸ¡å€ããããŸãã
ããã«ãŠã§ã¢ïŒã€ãŸããã¬ã€ã€ãŒïŒãæ§ç¯ããã«ã¯ã次ã®æ¡ä»¶ãæºãããŠããå¿ èŠããããŸãã
- ããã±ãŒãžPlack :: Middleware :: MYCOOLMIDDLEWAREã«å ¥ããŸããMYCOOLMIDDLEWAREã¯ããã«ãŠã§ã¢ã®ååã§ãã
- åºæ¬ã¯ã©ã¹Plack ::ããã«ãŠã§ã¢ãæ¡åŒµããŸãïŒèŠªqw / Plack ::ããã«ãŠã§ã¢/;ã䜿çšïŒã
- åŒã³åºãã¡ãœããïŒé¢æ°ïŒãå®è£ ããŸãã
ãããã£ãŠãäžèšã®ãã¹ãŠãèæ ®ããŠãæãåçŽãªããã«ãŠã§ã¢ãå®è£ ããŸãã
package Plack::Middleware::PostOnly; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); if ($req->method() ne 'POST') { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } return $self->app->($env); }
äœãèµ·ãã£ãã®ããããã«è©³ããèããŠã¿ãŸãããã åºæ¬ã¯ã©ã¹Plack :: MiddlewareïŒ2ãã€ã³ãïŒãç¶æ¿ããåŒã³åºãã¡ãœããïŒ3ãã€ã³ãïŒãå®è£ ããããã±ãŒãžPlack :: MiddlewareïŒ1ãã€ã³ãïŒã«ããã³ãŒãããããŸãã
æ瀺ãããåŒã³åºãå®è£ ã¯æ¬¡ã®ããšãè¡ããŸãã
- Plack :: Middlewareããã³envïŒmyïŒ$ selfã$ envïŒ= @_;ïŒã®ã€ã³ã¹ã¿ã³ã¹ããã©ã¡ãŒã¿ãŒãšããŠåãåããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãåãå ¥ãããªã¯ãšã¹ããäœæããŸãïŒåã®äŸã§äœ¿çšãããã®ãšåæ§ã®äœæïŒã
- POSTãªã¯ãšã¹ãã¡ãœãããããã§ãããã©ããããã§ãã¯ããããã«ãŠã§ã¢ã¯ãªã¯ãšã¹ãåŠçãããã«ã¹ãããããŸãã
èŠæ±ã¡ãœãããPOSTã§ãªãå Žåã¯ã©ããªãããæ€èšããŠãã ããã
ã¡ãœãããPOSTã§ãªãå Žåãæ°ããPlack :: Responseãªããžã§ã¯ããäœæãããã¢ããªã±ãŒã·ã§ã³ãåŒã³åºããã«ããã«è¿ãããŸãã
äžè¬ã«ãããã«ãŠã§ã¢ã®åŒã³åºãé¢æ°ã¯ãæ£ç¢ºã«2ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã ããã¯ïŒ
- ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããåã®EnvåŠçã
- ã¢ããªã±ãŒã·ã§ã³åŸã®çµæã®åŠçã
ããã«ã€ããŠã¯ããã¥ã¢ã³ã¹ããŸãšããŠç解ãããšãã«ãèšäºã®æåŸã§èª¬æããŸãã
Sharing Plack ::ããã«ãŠã§ã¢ãšPlack :: Builder
Plack ::ããã«ãŠã§ã¢:: PostOnlyã®æ¢æã¬ã€ã€ãŒããããŸããPSGIã¢ããªã±ãŒã·ã§ã³ããããåé¡ããããŸãã åé¡ã¯æ¬¡ã®ããã«ãªããŸãããçŸæç¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã°ããŒãã«ã«åœ±é¿ãäžããããšã¯ã§ããŸãããã ã§ããããã«ãªããŸããã Plack :: Builderã®æãéèŠãªãã€ã³ãã§ããenableããŒã¯ãŒããèæ ®ããŠãã ããã
enableããŒã¯ãŒãã䜿çšãããšãPlack :: Middlewareãã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ã§ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
my $main_app = builder { enable "PostOnly"; mount "/" => builder { $api_app; }; }
ããã¯ãåæã«éåžžã«ã·ã³ãã«ã§éåžžã«åŒ·åãªã¡ã«ããºã ã§ãã ãã¹ãŠã®ã³ãŒãã1ãæã«ãŸãšããŠãçµæã確èªããŸãã
PSGIã¢ããªã±ãŒã·ã§ã³ïŒ
use strict; use warnings; use Plack; use Plack::Builder; use Plack::Request; use Plack::Middleware::PostOnly; my $api_app = sub { my $env = shift; warn 'WORKS'; my $req = Plack::Request->new($env); my $res = $req->new_response(200); my $params = $req->parameters(); if ($params->{string} && $params->{string} eq 'data') { $res->body('ok'); } else { $res->body('not ok'); } return $res->finalize(); }; my $main_app = builder { enable "PostOnly"; mount "/" => builder { $api_app }; }
ããã«ãŠã§ã¢ïŒ
package Plack::Middleware::PostOnly; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); if ($req->method() ne 'POST') { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } return $self->app->($env); }
ã¢ããªã±ãŒã·ã§ã³ã¯ã次ã®ã³ãã³ãã§èµ·åãããŸãã
/usr/bin/starman --port 8080 app.psgi
Plack :: Builderã¯ããã±ãŒãžåãèªåçã«Plack ::ããã«ãŠã§ã¢ã«çœ®ãæãããããã³ãŒãã§ã¯ãPostOnlyããæå¹ã«ããŸããã enable "PostOnly"ãã€ãŸãenable "Plack :: Middleware :: PostOnly"ãæå³ããŸãïŒ+ãã¬ãã£ãã¯ã¹ã䜿çšããŠã¯ã©ã¹ãžã®ãã«ãã¹ãæå®ã§ããŸããããšãã°ã "+ MyApp :: Middleware :: PostOnly"ãæå¹ã«ããŸãããšãã£ã¿ãŒïŒã
ããã§ãGETã¡ãœããã䜿çšããŠlocalhost ïŒ8080 /ã«ã¢ã¯ã»ã¹ãããšãã¡ãœããã405ã®å¿çã³ãŒãã§èš±å¯ãããŠããªãããšã瀺ãã¡ãã»ãŒãžã衚瀺ãããŸãããPOSTã¡ãœããã§ã¢ã¯ã»ã¹ãããšããã¹ãŠæ£åžžã«ãªããŸãã
èŠåã®ãWORKSãè¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¯ç¡é§ã§ã¯ãããŸããã ã¡ãœãããPOSTã§ãªãå Žåãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããªãããšã確èªããŸãã GETãéä¿¡ããŠã¿ãŠãã ãããSTDERRã¹ã¿ãŒãã³ã«ã¯ãã®ã¡ãã»ãŒãžã¯è¡šç€ºãããŸããã
PSGIãµãŒããŒã«ã¯ãèå³æ·±ãåäœæ©èœãããªããããŸãããããã«ã€ããŠã¯ã以äžã®èšäºã§ç¢ºå®ã«æ€èšãããŸãã
Plack ::ããã«ãŠã§ã¢ã®ããã«äŸ¿å©ãªãã€ã³ããèŠãŠã¿ãŸãããã
- ã¢ããªã±ãŒã·ã§ã³å®è¡åŸã®åŠççµæã
- ããã«ãŠã§ã¢ã«ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã
2ã€ã®PSGIã¢ããªã±ãŒã·ã§ã³ããããäžæ¹ãPOSTã§åäœããããäžæ¹ãGETã§ã®ã¿åäœããããšã確èªããå¿ èŠããããšããŸãã ããšãã°ã次ã®ããã«ãGETã¡ãœããã«ã®ã¿å¿çããå¥ã®ããã«ãŠã§ã¢ãèšè¿°ããããšã§ãåé¡ãçæ£é¢ãã解決ã§ããŸãã
package Plack::Middleware::GetOnly; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); if ($req->method() ne 'GET') { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } return $self->app->($env); }
åé¡ã¯è§£æ±ºããŸããããå€ãã®éè€ãæ®ã£ãŠããŸãã
ãã®åé¡ã解決ããããšã§ã次ã®ããšã«å¯ŸåŠã§ããŸãã
- å€æ°ãããã«ãŠã§ã¢ã«æž¡ãããã®ã¡ã«ããºã ã
- ã¢ããªã±ãŒã·ã§ã³çšã®ããã«ãŠã§ã¢ãåå¥ã«æ¥ç¶ããŸãã
ãã®åé¡ã®è§£æ±ºçã¯æ¬¡ã®ãšããã§ããç®çã®ã¡ãœãããå€æ°ãšããŠæž¡ããŸãã Plack :: Builderããã®æå¹åã®æ€èšã«æ»ããŸãããã enableã¯å€æ°ãåãå ¥ããããšãã§ããŸãã 次ã®ããã«ãªããŸãã
my $main_app = builder { enable "Foo", one => 'two', three => 'four'; mount "/" => builder { $api_app }; }
ããã«ãŠã§ã¢èªäœã§ã¯ããããã®å€æ°ã¯$ selfããçŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã ããšãã°ãå€æ°oneã«æž¡ãããå€ãååŸããã«ã¯ãããã«ãŠã§ã¢ã³ãŒãã§$ self-> {one}ãåç §ããå¿ èŠããããŸãã PostOnlyã®å€æŽãç¶ããŸãã
äŸïŒ
package Plack::Middleware::GetOnly; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); warn $self->{one} if $self->{one}; if ($req->method() ne 'GET') { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } return $self->app->($env); }
ã¹ã¿ãŒãã³ãåèµ·åããlocalhostïŒ8080ã«ãªã¯ãšã¹ããéä¿¡ããŸããSTDERRã«ã¯æ¬¡ã®ããã«è¡šç€ºãããŸãã
two at /home/noxx/perl/lib/Plack/Middleware/PostOnly.pm line 12.
ãããã£ãŠãå€æ°ã¯Plack :: Middlewareã«è»¢éãããŸãã
ãã®ã¡ã«ããºã ã䜿çšããŠãããã«ãŠã§ã¢ãäœæããŸãã
package Plack::Middleware::Only; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); my $method = $self->{method}; $method ||= 'ANY'; if ($method ne 'ANY' && $req->method() ne $method) { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } return $self->app->($env); } 1;
ããã«ãŠã§ã¢ã¯ããã©ã¡ãŒã¿ã§æž¡ããããªã¯ãšã¹ãã¡ãœããã«ã®ã¿å¿çã§ããããã«ãªããŸããã ãããã«å€æŽãããæ¥ç¶ã¯æ¬¡ã®ããã«ãªããŸãã
my $main_app = builder { enable "Only", method => 'POST'; mount "/" => builder { $api_app }; };
ãã®å ŽåãèŠæ±ã¡ãœãããPOSTã§ããå Žåã«ã®ã¿ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŸãã
ã¢ããªã±ãŒã·ã§ã³å®è¡åŸã®åŠççµæãæ€èšããŠãã ããã ã¡ãœãããèš±å¯ãããŠããå ŽåããALLOWEDããšããåèªãå¿çæ¬æã«è¿œå ããããšããŸãã
ã€ãŸããã¢ããªã±ãŒã·ã§ã³ãokãäžããå¿ èŠãããå Žåããã¡ããæå¹ãªã¡ãœããã§èŠæ±ãå®è¡ãããªãéããokã¯ALLOWEDãäžããŸãã
Only.pmã次ã®ãã©ãŒã ã«æã£ãŠãããŸãããã
package Plack::Middleware::Only; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack; use Plack::Response; use Plack::Request; sub call { my ($self, $env) = @_; my $req = Plack::Request->new($env); my $method = $self->{method}; $method ||= 'ANY'; if ($method ne 'ANY' && $req->method() ne $method) { my $new_res = $req->new_response(405); $new_res->body('Method not allowed'); return $new_res->finalize(); } my $plack_res = $self->app->($env); $plack_res->[2]->[0] .= 'ALLOWED'; return $plack_res; } 1;
$ self-> app->ïŒ$ envïŒã¯ã3ã€ã®èŠçŽ ã®é åïŒPSGIä»æ§ïŒãžã®åç §ãè¿ããŸãããã®èŠçŽ ã®æ¬äœã¯å€æŽãããåçãšããŠæäŸãããŸãã
èš±å¯ãããã¡ãœããã«ãã£ãŠstring = dataããã³string = data1å€æ°ãæž¡ãããšã«ãããããããã¹ãŠæ£åžžã«æ©èœããããšã確èªããŠãã ããã æåã®ã±ãŒã¹ã§ã¯ãã¡ãœãããæå¹ã«ãªã£ãŠãããšãçãã¯ãokALLOWEDãã«ãªãã2çªç®ã®ãnot okALLOWEDãã«ãªããŸãã
çµè«ãšããŠãäžèšã®ãã¹ãŠã1ã€ã®Plackã¢ããªã±ãŒã·ã§ã³ã«æ£ç¢ºã«çµã¿åãããããšãã§ããæ¹æ³ãæ€èšããŸãã å ã®ã¿ã¹ã¯ã«æ»ããŸãã å€æ°stringãåãå ¥ããåçŽãªAPIãéçºããstring = dataãokã®å Žåã¯okãããã§ãªãå Žåã¯okãè¿ãã次ã®ã«ãŒã«ãéµå®ããå¿ èŠããããŸãã
äœæã«é£çµ¡ãããšã/ä»»æã®æ¹æ³ã«å¿çãããšãã
ã¢ãã¬ã¹/æçš¿ã«ã¢ã¯ã»ã¹ãããšãã¯ãPOSTã¡ãœããã«ã®ã¿å¿çããŸãã
/ getã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ãããšãã¯ãGETã¡ãœããã«ã®ã¿å¿çããŸãã
å®éãèšè¿°ãããã¢ããªã±ãŒã·ã§ã³ã¯1ã€ã ãã§ã-$ api_appãšãããã«å€æŽããããã«ããŒã§ãã
ãã®çµæãäžèšã®ãã¹ãŠã䜿çšããŠã次ã®åœ¢åŒã®ã¢ããªã±ãŒã·ã§ã³ãååŸããå¿ èŠããããŸãã
use strict; use warnings; use Plack; use Plack::Builder; use Plack::Request; use Plack::Middleware::PostOnly; use Plack::Middleware::Only; my $api_app = sub { my $env = shift; my $req = Plack::Request->new($env); my $res = $req->new_response(200); my $params = $req->parameters(); warn 'RUN!'; if ($params->{string} && $params->{string} eq 'data') { $res->body('ok'); } else { $res->body('not ok'); } return $res->finalize(); }; my $main_app = builder { mount "/" => builder { mount "/post" => builder { enable "Only", method => 'POST'; $api_app; }; mount "/get" => builder { enable "Only", method => 'GET'; $api_app; }; mount "/" => builder { $api_app; }; }; };
ãããã£ãŠãããã«ãŠã§ã¢æ¥ç¶ã¯ãã¹ããããPlack :: Builderã«ãŒãã§æ©èœããŸãã ã³ãŒãã®ã·ã³ãã«ããšäžè²«æ§ã«æ³šæãã䟡å€ããããŸãã
延æãããåçã¯ãéåæãµãŒããŒã«é¢ããèšäºïŒTwiggyãCoronaãFeersumïŒã§æ€èšãããŸãã