我正在尝试为客户端虚拟化一个旧系统。这使用SOAP将数据从前端传递到后端,然后再返回。所有代码都已复制,并从CPAN安装了相关的Perl模块。大多数前端系统工作正常,但当进行SOAP调用时,系统崩溃,API日志中有此错误:
Illegal field name 'APR::Table=HASH(0x7fe19a0c41e0)' at /usr/lib/perl5/site_perl/5.20.1/SOAP/Transport/HTTP2.pm line 103.
查看有问题的模块,出现错误的部分如下,第103行是do {}
块:
my $cl = ($self->{'MOD_PERL_VERSION'} == 1) ?
$r->header_in('Content-length') : $r->headers_in->{'Content-length'};
$self->request(HTTP::Request->new(
$r->method() => $r->uri,
HTTP::Headers->new($r->headers_in),
do { my ($c,$buf); while ($r->read($buf,$cl)) { $c.=$buf; } $c; }
));
$self->SUPER::handle;
我在使用OO Perl时遇到了一些困难(我认为是以过程的方式)但据我所知,它是在构建一个对象,其中方法是URI,然后在do{}
循环中构造头部,将它们附加到$c
,最后将$c
添加到对象。我假设它不喜欢循环返回的一个或多个字段名称,但是当我尝试添加debug以在循环时将$buf
变量打印到/tmp中的文件时,它没有生成任何输出。
在试图解决这个问题时,我遇到了这个建议(尽管这与Transport::HTTP有关,而不是我们正在使用的Transport::HTTP 2):https://www.tnpi.net/support/forums/index.php?topic=1037.0我已将HTTP::Message降级到版本6.04,但错误仍然存在。
所以我想知道a)如何得到一些调试输出来看看问题到底是什么,以及b)关于如何让它工作的任何建议?
更新1(回应第一个答复):
谢谢你!
它似乎不喜欢my $data = do{}
部分,所以我使用了这个:
use Data::Dumper;
my ($data);
open (L1, ">>/tmp/testlog1.txt");
print L1 "Starting to dump data...\n";
my $method = $r->method();
print L1 "Dumping \$r\n" . Dumper($r);
print L1 "Dumping \$method\n" . Dumper($method);
my $uri = $r->uri;
print L1 "\$method = $method => $uri\n";
my $headers = HTTP::Headers->new($r->headers_in);
print L1 "Dumping headers\n" . Dumper($headers);
它产生了下面的输出。
Starting to dump data...
Dumping $r
$VAR1 = bless( do{\(my $o = '140277572968608')}, 'Apache2::RequestRec' );
Dumping $method
$VAR1 = 'POST';
$method = POST => /
Dumping headers
$VAR1 = bless( {}, 'HTTP::Headers' );
变量真的应该包含“bless”结构吗?
2条答案
按热度按时间lhcgjxsq1#
要进一步调试,请尝试调试发送到
$self->request
的值,以及实际导致错误的命令。我会尝试这样的方法(替换
$self->request
语句):umuewwlo2#
检查请求头的配置,确保Content_Type(例如application/json;charset=utf-8)与您的内容(即您的发布数据)相同。