如何将找不到的 Mojolicious Lite 默认错误更改为自定义 json 响应

How to change Mojolicious Lite default error not found to a custom json response

我正在使用 Mojolicious Lite 创建 json 网络服务。

默认情况下,Mojolicious returns HTML 对服务器错误或未找到错误的响应。

有没有办法将其覆盖为自定义 JSON 响应?

Rendering guide 讨论了如何自定义这些响应。

这里有两种方法:

  1. 使用 json 作为应用程序的默认格式并使用 not_found.*.json.ep 模板

    use Mojolicious::Lite;
    app->renderer->default_format('json');
    app->start;
    __DATA__
    
    @@ not_found.development.json.ep
    {"not":"found","code":404,"data":{"key1":"value1","key2":[42,19,"value3"]}}
    
  2. 使用 before_render 挂钩覆盖 json 负载。

    use Mojolicious::Lite;
    hook before_render => sub {
        my ($c,$args) = @_;
        if ($args->{template} && $args->{template} eq 'not_found') {
            $args->{json} = { "too bad" => "so sad" };
        }
    };
    app->start;
    

一分钟过去了,但在 Mojo 9 的完整应用程序中,我刚刚返回 JSON 并返回状态:

$c->render( json => $json, status => 404 );

但是,我在设置的最后还有一条 catch-all 路线:

$self->routes->any('/*')->to( ... );