Как пропустить сериализатор в Dancer2?

Мое приложение настроено на отправку ответов JSON. Мне нужно добавить к нему конечную точку RSS (или что-то еще). Сериализаторов без операций не существует, хотя написать их было бы тривиально:

{ # do not use this lol
    package Dancer2::Serializer::ThisIsNotAnOkayThingToDo_Raw;
    use Moo;
    with 'Dancer2::Core::Role::Serializer';
    sub serialize { $_[1] }
    sub deserialize { $_[1] }
    1;
}

get '/mything/rss' => sub {
  my $rss = new XML::RSS (version => '2.0');
  $rss->channel(title => "Wharrgarbl");
  $rss->add_item(title => "Potato");
  send_as(ThisIsNotAnOkayThingToDo_Raw => $rss->as_string, {content_type => 'application/rss+xml; charset=UTF-8'});
}

Это, однако, терпит неудачу, утверждая, что __PACKAGE__::send_as не определено (но запуск perldoc Dancer2::Manual на сервере говорит, что send_as должен быть там).

# __PACKAGE__ is me redacting the sensitive out of the error message
Undefined subroutine &__PACKAGE__::send_as called at...

В документации также утверждается, что send_as использует send_file, поэтому я попытался исключить посредника:

get '/mything/rss' => sub {
  my $rss = new XML::RSS (version => '2.0');
  $rss->channel(title => "Wharrgarbl");
  $rss->add_item(title => "Potato");
  my $xml = $rss->as_string;
  send_file(\$xml, content_type => 'application/rss+xml; charset=UTF-8');
}

Однако это проходит через сериализатор:

hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this) at .../site/lib/JSON.pm line 154.

Что?


person badp    schedule 10.04.2018    source источник


Ответы (2)


Используйте send_as:

Позволяет текущему обработчику маршрута возвращать клиенту определенные типы контента с помощью указанного сериализатора или в формате html.

Вы можете использовать его, чтобы указать свой собственный сериализатор или просто использовать сериализатор html по умолчанию, но изменить тип содержимого для rss.

use Dancer2;
set serializer => 'JSON';

get '/mything/rss' => sub {
  # Get your rss string 
  # ...
  my $xml = '<rss>content</rss>';
  send_as html => $xml , { content_type => 'application/rss+xml; charset=UTF-8' };
}

dance;
person Pat    schedule 12.04.2018
comment
send_as - это буквально первое, что я попробовал в своем вопросе. - person badp; 13.04.2018
comment
Можете ли вы получить пример кода для запуска вне вашего приложения? Данный пример должен быть полностью работающим приложением dancer2. Чтобы проверить, связана ли проблема с вашей установкой Dancer2 или что-то не так в вашем приложении - person Pat; 20.04.2018

person    schedule
comment
этот ответ на самом деле найден Erik Jan Vos, пожалуйста, пришлите драгоценную интернет-карму его выбор - person badp; 10.04.2018
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Vishal Chhodwani; 11.04.2018