2017-01-20 2 views
0

Я новичок в Perl и Mojo и у меня есть одна проблема, получая POST-данных из Угловая:Mojolicious Угловая POST JSON

Мой 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 Не найдено Дата: Пт, 20 Янв 2017 09:49:57 GMT

Что не так? Мне кажется, что $ json = $ self-> req-> json не получает JSON-String от POST?

+0

Вы не должны «печатать» в Mojo. Вам нужно что-то вернуть. Кроме того, как вы используете приложение? С 'morbo'? – simbabque

+0

Пожалуйста, отредактируйте новую информацию, которую вы опубликовали, в качестве ответа на свой вопрос с помощью ссылки [edit]. Затем удалите этот ответ. Он будет опущен и удален сообществом, если вы этого не сделаете сами. – simbabque

+0

Не используйте print(), вы используете $ self-> app-> log-> debug ($ self-> dumper (...)). Печать() ненадежна. – user3606329

ответ

0

Сообщается, что 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, но я не уверен.

+1

Думаю, он получает 404, потому что ничего не отображается. –

+0

@ Helmut возможно, но разве это действительно не найдено? – simbabque

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.)

0

Я не думаю, что вы должны JSON-подкрепить свой объект.

Попробуйте заменить свою первую угловую линию с этим:

var datainput = {test: "orcl"}; 
0

Угловыми проходит сообщения через тело запроса, так это то, как я обрабатывать их.

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 posts будут использовать параметры, а не тело.

Смежные вопросы