3

私にとって、Mojolicious で JSON を解析することは不可能です。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
}

これがMojoliciousのRESTfulコードです

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

Mojo::JSON から $self->req->body を呼び出してから decode_json を呼び出すと、

[error] Malformed JSON: Expected string while parsing object at line 1,  offset 5 at /home/aa/sempt2.pl line 15.

では、JSON を正しく解析するにはどうすればよいでしょうか。

4

2 に答える 2

6

これは 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 スタイルでテストを作成するのがさらに良いでしょう。

于 2016-02-20T09:24:28.493 に答える
5

解決しました!

{
   'id': 1
}

に置き換える必要があります

{
  "id": 1
}

その後、idにアクセスできます

my $test = decode_json($self->req->body);
$test->{id};

そして、短縮された方法

my $test = $self->req->json;
$test->{id};

も働いています!

エラーは、"" である必要がある間違った json エンコーディング '' が原因で発生しました。それが誰かを助けることを願っています。

于 2016-02-20T08:22:05.357 に答える