use*_*329 3 rest perl mojolicious mojolicious-lite
我不可能在Mojolicious中解析JSON.我更新了Mojolicious并在使用之前使用了代码,但不推荐使用JSON-> new.
my $json = Mojo::JSON->new;
my $user_request = $json->decode($c->req->body);
my $err = $json->error;
Run Code Online (Sandbox Code Playgroud)
从教程中,我发现已经添加了$ self-> req-> json,但所有POST都会导致错误和非工作代码.
 curl -H "Content-Type: application/json" --data @body.json http://localhost:3000/checkaddress
Run Code Online (Sandbox Code Playgroud)
而我的body.json看起来像这样
{
       'id': 1
}
Run Code Online (Sandbox Code Playgroud)
这是我在Mojolicious中的RESTful代码
post '/checkaddress' => sub {
my $self = shift;
my $dump = $self->dumper($self->req->json);
};
Run Code Online (Sandbox Code Playgroud)
控制台日志
[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
Run Code Online (Sandbox Code Playgroud)
调用$ self-> req-> body然后从Mojo :: JSON调用decode_json将导致
[error] Malformed JSON: Expected string while parsing object at line 1,  offset 5 at /home/aa/sempt2.pl line 15.
Run Code Online (Sandbox Code Playgroud)
那么,现在如何正确解析JSON?
这与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;
Run Code Online (Sandbox Code Playgroud)
为方便和可靠地测试小客户端脚本:
#!perl
use strict;
use warnings;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $tx = $ua->post('http://localhost:3000/checkaddress' => json =>
  {
    'id'  => "1",
  }
);
Run Code Online (Sandbox Code Playgroud)
此脚本可避免JSON编码问题.
更好的是,以Mojolicious风格编写测试.
我解决了!
{
   'id': 1
}
Run Code Online (Sandbox Code Playgroud)
它需要被替换为
{
  "id": 1
}
Run Code Online (Sandbox Code Playgroud)
然后可以使用
my $test = decode_json($self->req->body);
$test->{id};
Run Code Online (Sandbox Code Playgroud)
而缩短的方式
my $test = $self->req->json;
$test->{id};
Run Code Online (Sandbox Code Playgroud)
工作呢!
由于错误的json编码'',错误发生,需要"".希望它可以帮助某人.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1309 次  |  
        
|   最近记录:  |