2 種類のリクエストを処理できるルートを宣言する必要があります。
GET /api/vote/:value
GET /api/vote/:value/:date
どちらの場合もデータの扱い方はそれほど変わらないので、同じ場所で定義していただきたいと思います。
私が今やったことは、wildcardプレースホルダーを使用したことです:
use Mojolicious::Lite -signatures;
use DateTime;
get '/vote/*values' => sub ($c) {
my $datetime = DateTime->now;
# Then we process the route parameters
my @params = split('/', $c->param('values'), 2);
# Optional if no date provided in the route
if ( defined $params[1] ) {
my @dates_params = split('-', $params[1], 3);
my %datetime = (
year => $dates_params[0],
month => $dates_params[1],
day => $dates_params[2],
);
$datetime = DateTime->new(%datetime);
}
my %vote = (
value => $params[0],
datetime => $datetime,
);
# ... More code here
$c->render(json => $data);
}
この方法で問題なく動作しますが、このソリューションはあまり明示的でもなく読みやすいものでもないため、あまり快適ではありません。また、他のフレームワークでも同様のことをより満足できる方法で実行できる可能性があることを知っています。
たとえば、以下では、Express.js ルーティング機能を使用して、1 つのルート宣言のみで/vote/123
到達することができます。/vote/123/2019-01-13
router.get('/vote/:value/:date*?', function(req, res, next) {
// Processing here...
res.json(// etc.);
});
注: この例は、この SO questionからのものです。
でさまざまな可能性を試した後Mojolicious::Lite
、Mojolicious ルートの正規表現は問題ではなく、見つけた最善の解決策はワイルドカード プレースホルダーであることがわかりました。何か不足していますか?