在Mojolicious应用程序中,我使用模板来生成XML,以向Exchange Web Services发送请求。
在一种情况下,我必须一个接一个地执行两个模板=>请求周期,并且看起来像在第二个调用中,第一个调用的内容与第二个调用的内容串联在一起,从而使结果不正确。 / p>
如果我在渲染完东西后将存储区的mojo.content
字段设置为空字符串,则可以解决此问题(请参见第一个代码段中的“为什么需要”。
那是为什么?代码如下(为清晰起见,希望略过)。
在一个包装中:
use Mojo::Base 'Mojolicious::Plugin';
sub user_location {
my ($self, $c, $name) = @_;
my $url = Mojo::URL->new($c->app->config->{root});
my $xml = $c->render_to_string(template => 'xml/whois', format => "xml", name => $name);
#----------------------
# WHY IS THIS NEEDED?
#----------------------
$c->stash->{'mojo.content'} = undef;
my $ua = Mojo::UserAgent->new();
my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);
if ($tx->res->is_success) {
# do things
# return result
}
}
在其他包装中:
use Mojo::Base 'Mojolicious::Controller';
sub get_freebusy {
my $c = shift;
my $loc = $c->user_location;
my $tx = $c->get_ews('xml/calendar');
if ($tx->res->is_success) {
# do things
# return result
}
}
和另一个软件包:
sub register {
my ($self, $app, $conf) = @_;
$app->helper('get_ews' => sub {
my $c = shift;
my $template = shift;
my $url = Mojo::URL->new($c->app->config->{root});
my $ua = Mojo::UserAgent->new();
my $xml = $c->render_to_string(template => $template, format => "xml");
my $tx = $ua->post($url => {'Content-Type' => 'text/xml', 'Accept-Encoding' => 'None' } => $xml);
if ($tx->res->is_success) {
unless ($tx->res->dom->at('ResponseCode')->all_text eq 'NoError') {
$tx->res->code(500);
}
} else {
# handle error
}
return $tx;
});
}