Дополнительные параметры POST в Mojolicious Lite с Perl

Есть ли способ обозначить параметр POST как необязательный в Perl с помощью Mojolicious Lite? Например, есть ли способ заставить сервер не возвращать 404, если param2 не определено в теле запроса?

post "/my_post" => \&render(post_callback);

sub post_callback {
    my ($mojo) = @_;
    my $param1 = $mojo->param("param1");
    my $param2 = $mojo->param("param2");
}

person Danny Sullivan    schedule 06.07.2015    source источник
comment
Уверен, что нет. Он просто устанавливает param2 в undef. Если вы получаете 404, это потому, что ваш обратный вызов ничего не отображает.   -  person Sobrique    schedule 06.07.2015
comment
Если он перенаправляется на правильный обратный вызов, не должен ли он всегда возвращать что-то кроме 404? Моя проблема в том, что он даже не перенаправляется на правильный обратный вызов. Хотя, если бы я указал и param1, и param2, он был бы перенаправлен на post_callback и вернул бы 200.   -  person Danny Sullivan    schedule 06.07.2015
comment
Нет. Mojolicious рендерит что-то, когда ему говорят. Иногда он делает это неявно. Попробуйте добавить: $mojo -> render ( text => "It worked" ); в конце обратного вызова.   -  person Sobrique    schedule 06.07.2015
comment
Отлично, большое спасибо за вашу помощь!   -  person Danny Sullivan    schedule 06.07.2015
comment
Если это решило проблему, могу ли я предложить добавить краткий сводный ответ для будущих читателей?   -  person Sobrique    schedule 06.07.2015
comment
Конечно, жду...   -  person Danny Sullivan    schedule 06.07.2015


Ответы (2)


Моя проблема заключалась в том, что я неправильно понял, насколько mojolicious маршрутизируется к обратному вызову. Следующий код работает с обоими необязательными параметрами:

#!/usr/bin/env perl
use strict;
use warnings;
use Mojolicious::Lite;

post '/' => sub {
    my ($mojo) = @_;
    my $param1 = $mojo->param("param1");
    my $param2 = $mojo->param("param2");
    $mojo->render(text => "param1: $param1, param2: $param2");
};

app->start;

Если вы запустите это, используя: ./my_server.pl daemon, вы сможете отправлять запросы POST с любой комбинацией параметров.

person Danny Sullivan    schedule 06.07.2015

В посте я предпочитаю не использовать параметры, а размещать все параметры в одной строке JSON. Mojolicous post-action получит json-строку в качестве хеш-ссылки.

Пример:

# The posted data looks like:
# '{ "username": "rob", "password": "secret" }'
#
sub authenticate {
    my $self = shift;
    my $jsonHash = $self->req->json ;
    $self->render( text => Dumper($jsonHash)) ;
}

С помощью curl легко проверить сообщение:

curl -X POST -d '{ "username": "rob", "password": "secret" }' http://hp-probook:3000/users/authenticate
person Rob Lassche    schedule 05.09.2018