Mojolicious Angular POST JSON

时间:2017-01-20 09:53:40

标签: angularjs json perl mojolicious mojolicious-lite

我是Perl和Mojo的新手,我从Angular接收POST数据时遇到了一个问题:

我的AngularCode是

var datainput = JSON.stringify({"test":"orcl"});
$http.post('http://localhost/perltest/perltest.pl/post', datainput)
        .success(function(data, status, headers, config) {
        console.log("post geschickt");
        console.log(headers());
        console.log(data);
        console.log("data back: " + JSON.stringify(data));
        alert(JSON.stringify(data));
    })

My Mojo-Sub看起来像:

post '/post' => sub {
my $self = shift;

my $json = $self->req->json;
print header(-type => "text/html"); 
print Dumper($json->{test});
};
app->start;

我得到的结果是: $ VAR1 = undef; Content-Length:0状态:404未找到日期:星期五,2017年1月20日09:49:57 GMT

有什么问题? 在我看来,$ json = $ self-> req-> json没有从POST获取JSON-String?

4 个答案:

答案 0 :(得分:2)

Angular通过请求正文传递帖子,所以我就是这样处理的。

post '/post' => sub {
    my $self = shift;
    my $json = $self->req->body;
    #use Mojo::JSON qw(decode_json encode_json) at top of app
    my $perl_hash = decode_json($json)
    #Do something with the hash, like pass to a helper or model
    $self->render(json => $return_from_model_or_helper);
};

Jquery帖子将使用params而不是body。

答案 1 :(得分:1)

docs for the json method表示如果解码无效或请求为空,则会返回undef。您应该首先查看请求正文。

warn Dumper $self->req->body;

这会将原始请求正文输出到您的应用程序控制台或日志。如果您运行morbo app.pl,那就是您的控制台窗口。看看你看到了什么。那里的内容是什么?内容类型是否正确?

然后从那里拿走。

您不能在路由处理程序中间print。您需要使用应用程序对象render您的内容。

post '/post' => sub {
    my $self = shift;
    my $json = $self->req->json;

    $self->render( text => $json->{test} );
};

这样,Mojolicious会为您照顾一切。也无需明确设置内容类型。它会自动使用合理的东西。

但是,你得到404回来了。这可能是因为print,但我不确定。

答案 2 :(得分:1)

  1. 404 Not Found表示找不到资源。请仔细检查您的申请是否在http://localhost/perltest/perltest.pl/post下提供。

  2. 您不应该使用print(),因为它不可靠(有时它可以工作,有时不工作)。如果您想将文本记录到控制台,请使用$ self-> app-> log-> debug()。 Mojolicious还有$ self-> dumper,你不需要包含外部模块Data::Dumper

  3. 检查实际发送的数据。您可以使用http://requestb.in/之类的服务。如果你收到正确的JSON;我强烈期望URL不正确(参见第1点。)

答案 3 :(得分:0)

我认为你不应该对你的对象进行JSON字符串化。

尝试用以下方法替换您的第一个角度线:

var datainput = {test: "orcl"};