Mojolicious - не могу разобрать JSON в RESTful
Для меня невозможно разобрать JSON в Mojolicious. Я обновил Mojolicious и использовал перед следующим кодом, но JSON->new устарел.
my $json = Mojo::JSON->new;
my $user_request = $json->decode($c->req->body);
my $err = $json->error;
из учебников я узнал, что там был добавлен $self->req->json, но все POST-ы к этому приведут к ошибкам и неработающему коду.
curl -H "Content-Type: application/json" --data @body.json http://localhost:3000/checkaddress
и мой body.json выглядит так
{
'id': 1
}
Вот мой код RESTful в Mojolicious
post '/checkaddress' => sub {
my $self = shift;
my $dump = $self->dumper($self->req->json);
};
Консольный журнал
[Sat Feb 20 08:23:27 2016] [debug] 200 OK (0.001688s, 592.417/s)
[Sat Feb 20 08:24:38 2016] [debug] POST "/checkaddress"
[Sat Feb 20 08:24:38 2016] [debug] Routing to a callback
[Sat Feb 20 08:24:38 2016] [debug] undef
Вызов $self->req->body и затем decode_json из Mojo::JSON приведет к
[error] Malformed JSON: Expected string while parsing object at line 1, offset 5 at /home/aa/sempt2.pl line 15.
Итак, как правильно разобрать JSON сейчас?
2 ответа
Это работает с Mojolicious 6.25 и является полным примером:
package MyREST;
use Mojo::Base 'Mojolicious';
use Data::Dumper;
sub startup {
my $app = shift;
my $routes = $app->routes;
$routes->post('/checkaddress' => sub {
my $self = shift;
my $data = $self->req->json;
my $dump = $self->dumper($self->req->json);
print STDERR $dump;
$self->render(json => $data);
});
}
1;
Для удобства и надёжности тестирования небольшой клиентский скрипт:
#!perl
use strict;
use warnings;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $tx = $ua->post('http://localhost:3000/checkaddress' => json =>
{
'id' => "1",
}
);
Этот скрипт позволяет избежать проблем с кодировкой JSON.
Еще лучше было бы написать тесты в стиле Mojolicious.
Я решил это!
{
'id': 1
}
его нужно заменить на
{
"id": 1
}
а затем идентификатор может быть затем доступен с
my $test = decode_json($self->req->body);
$test->{id};
И сокращенный путь
my $test = $self->req->json;
$test->{id};
тоже работает!
Ошибки произошли из-за неправильной кодировки json '', которая должна быть "". Надеюсь, это поможет кому-то.