0

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

我的 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));
    })

我的 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; 内容长度:0 状态:404 未找到日期:2017 年 1 月 20 日星期五 09:49:57 GMT

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

4

4 回答 4

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 帖子将使用参数而不是正文。

于 2017-02-26T23:14:36.370 回答
1

方法的文档json说,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,但我不确定。

于 2017-01-20T11:21:59.240 回答
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 点。)

于 2017-01-20T17:44:20.620 回答
0

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

尝试用这个替换你的第一条角线:

var datainput = {test: "orcl"};
于 2017-01-22T05:17:54.353 回答