如何为所有传入的 URL 创建通用处理程序?
How to create common handler for all incoming URLs?
我正在编写一些网络 api,其中 return 数据采用 JSON 格式。
对于所有传入的 url,如果缓存期限没有过期,我需要 return 从缓存中获取一些结果。
此逻辑对所有网址通用。
问题:
如何为 Mojolicious::Lite 中的所有传入 URL 实现一些通用逻辑?
我试过了
any '/:bar' => [bar => qr/.+/] => sub {
# ...
# Return JSON object immediately from cache if it is applicable
# ...
}
但这会导致页面加载时间过长,并且
Template "bar.html.ep" not found
在 morbo 日志中(但在很长的延迟之后,最终会执行获取“/target”处理程序)。
我是 Mojo 的完美新手,所以任何帮助都将不胜感激
谢谢!
是的,before_dispatch
挂钩似乎是正确的方法,它确实适用于 Mojolicious::Lite
。这是一个概念验证,它将为每个独特的请求产生一个新的结果,但 return 重复请求的重复结果。在此程序中,常规请求处理程序填充缓存,但如果您想将该部分与代码的主要功能分开,您可以在 after_dispatch
挂钩中进行缓存。
use Mojolicious::Lite;
our %CACHE;
any '/:any' => sub {
my $self = shift;
my $param = $self->param('any');
my $result = { reqtime => time, param => $param, number => rand };
my $path = $self->req->url->path->to_string;
$CACHE{$path} //= $result;
$self->render( json => $result );
};
app->hook( before_dispatch => sub {
my $c = shift;
my $path = $c->req->url->path->to_string;
if (defined($CACHE{$path})) {
$c->render( json => $CACHE{$path}, status => 200 );
}
} );
app->secrets([42])->start;
样本运行:
$ morbo cachedemo.pl >/dev/null 2>&1 &
$ for req in foo foo1 foo2 foo3 foo foo1
> do curl http://localhost:3000/$req ; echo ; sleep 1 ; done
{"number":0.848003210075227,"reqtime":1444254617,"param":"foo"}
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"}
{"number":0.484934245556467,"reqtime":1444254619,"param":"foo2"}
{"number":0.181112856445004,"reqtime":1444254620,"param":"foo3"}
{"number":0.848003210075227,"reqtime":1444254617,"param":"foo"} <-- dup
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"} <-- dup
您可以使用 * 占位符。看here
同时将您的应用程序放入开发人员 mode:
Mojolicious->new( mode => 'developer' );
$app->mode( 'developer');
你会得到漂亮的 404、500 页,对你很有帮助
我正在编写一些网络 api,其中 return 数据采用 JSON 格式。
对于所有传入的 url,如果缓存期限没有过期,我需要 return 从缓存中获取一些结果。
此逻辑对所有网址通用。
问题:
如何为 Mojolicious::Lite 中的所有传入 URL 实现一些通用逻辑?
我试过了
any '/:bar' => [bar => qr/.+/] => sub {
# ...
# Return JSON object immediately from cache if it is applicable
# ...
}
但这会导致页面加载时间过长,并且
Template "bar.html.ep" not found
在 morbo 日志中(但在很长的延迟之后,最终会执行获取“/target”处理程序)。
我是 Mojo 的完美新手,所以任何帮助都将不胜感激
谢谢!
是的,before_dispatch
挂钩似乎是正确的方法,它确实适用于 Mojolicious::Lite
。这是一个概念验证,它将为每个独特的请求产生一个新的结果,但 return 重复请求的重复结果。在此程序中,常规请求处理程序填充缓存,但如果您想将该部分与代码的主要功能分开,您可以在 after_dispatch
挂钩中进行缓存。
use Mojolicious::Lite;
our %CACHE;
any '/:any' => sub {
my $self = shift;
my $param = $self->param('any');
my $result = { reqtime => time, param => $param, number => rand };
my $path = $self->req->url->path->to_string;
$CACHE{$path} //= $result;
$self->render( json => $result );
};
app->hook( before_dispatch => sub {
my $c = shift;
my $path = $c->req->url->path->to_string;
if (defined($CACHE{$path})) {
$c->render( json => $CACHE{$path}, status => 200 );
}
} );
app->secrets([42])->start;
样本运行:
$ morbo cachedemo.pl >/dev/null 2>&1 &
$ for req in foo foo1 foo2 foo3 foo foo1
> do curl http://localhost:3000/$req ; echo ; sleep 1 ; done
{"number":0.848003210075227,"reqtime":1444254617,"param":"foo"}
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"}
{"number":0.484934245556467,"reqtime":1444254619,"param":"foo2"}
{"number":0.181112856445004,"reqtime":1444254620,"param":"foo3"}
{"number":0.848003210075227,"reqtime":1444254617,"param":"foo"} <-- dup
{"number":0.0745738560703799,"reqtime":1444254618,"param":"foo1"} <-- dup
您可以使用 * 占位符。看here
同时将您的应用程序放入开发人员 mode:
Mojolicious->new( mode => 'developer' );
$app->mode( 'developer');
你会得到漂亮的 404、500 页,对你很有帮助