我是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?
答案 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)
404 Not Found
表示找不到资源。请仔细检查您的申请是否在http://localhost/perltest/perltest.pl/post
下提供。
您不应该使用print(),因为它不可靠(有时它可以工作,有时不工作)。如果您想将文本记录到控制台,请使用$ self-> app-> log-> debug()。 Mojolicious还有$ self-> dumper,你不需要包含外部模块Data::Dumper
。
检查实际发送的数据。您可以使用http://requestb.in/之类的服务。如果你收到正确的JSON;我强烈期望URL不正确(参见第1点。)
答案 3 :(得分:0)
我认为你不应该对你的对象进行JSON字符串化。
尝试用以下方法替换您的第一个角度线:
var datainput = {test: "orcl"};