问题描述
我正在编写一个快速脚本来修改已提交的文件,并将该内容返回给用户.
I am writing a quick script to munge a submitted file, and return that content to the user.
我的测试代码如下:
#!/path/to/bin/perl
use strict;
use warnings;
use utf8;
use Apache2::RequestRec;
use Apache2::RequestIO;
my ( $xmlin, $accepts ) = (q{}, q{});
my $format = 'json';
# read the posted content
while (
Apache2::RequestIO::read($xmlin, 1024)
) {};
{
no warnings;
$accepts = $Apache2::RequestRec::headers_in{'Accepts'};
}
if ($accepts) {
for ($accepts) {
/application\/xml/i && do {
$format = 'xml';
last;
};
/text\/plain/i && do {
$format = 'text';
last;
};
} ## end for ($accepts)
} ## end if ($accepts)
print "format: $format; xml: $xmlin\n";
此代码无法使用Undefined subroutine &Apache2::RequestIO::read
如果我注释了while循环,则代码可以正常运行.
If I comment out the while loop, the code runs fine.
不幸的是,Apache2::RequestIO
代码是通过Apache2::XSLoader::load __PACKAGE__;
插入的,所以我无法检查实际代码....但我不明白为什么这不起作用
Unfortunately the Apache2::RequestIO
code is pulled in via Apache2::XSLoader::load __PACKAGE__;
so I can't check the actual code.... but I don't understand why this doesn't work
(是的,我也尝试过$r->read(...)
,无济于事)
(and yes, I've also tried $r->read(...)
, to no avail)
推荐答案
我也使用Apache2::RequestIO
读取正文:
sub body {
my $self = shift;
return $self->{ body } if defined $self->{ body };
$self->apr->read( $self->{ body }, $self->headers_in->get( 'Content-Length' ) );
$self->{ body };
}
在这种情况下,您应该将原始 Apache2::Request
子类化. .特别注意our @ISA = qw(Apache2::Request);
In this case you should subclass original Apache2::Request
. Especially pay attention to our @ISA = qw(Apache2::Request);
我不知道为什么,但是标准的body
方法返回了我:
I do not know why, but standard body
method return me:
$self->body # {}
$self->body_status # Missing parser
当Content-Type
是application/json
时.所以我以这种方式解决.然后自己解析身体:
when Content-Type
is application/json
. So I work around that in such way. Then parse body myself:
sub content {
my $self = shift;
return $self->{ content } if defined $self->{ content };
my $content_type = $self->headers_in->get('Content-Type');
$content_type =~ s/^(.*?);.*$/$1/;
return unless exists $self->{ $content_type };
return $self->{ content } = $self->{ $content_type }( $self->body, $self );
}
其中:
use JSON;
sub new {
my ($proto, $r) = @_;
my $self = $proto->SUPER::new($r);
$self->{ 'application/json' } = sub {
decode_json shift;
};
return $self;
}
这篇关于使用mod-perl 2获取http POST请求的正文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!