debugging 在Perl SOAP模块中调试“非法字段名”的最佳方法是什么?

rmbxnbpk  于 2023-03-30  发布在  Perl
关注(0)|答案(2)|浏览(156)

我正在尝试为客户端虚拟化一个旧系统。这使用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”结构吗?

lhcgjxsq

lhcgjxsq1#

要进一步调试,请尝试调试发送到$self->request的值,以及实际导致错误的命令。
我会尝试这样的方法(替换$self->request语句):

use Data::Dumper;
my $method = $r->method();
my $uri = $r->uri;
warn "$method => $uri";
my $headers = HTTP::Headers->new($r->headers_in);
warn Dumper($headers);
my $data; 
{ 
    my ($buf); 
    while ($r->read($buf,$cl)) { $data.=$buf; } 
}
warn "data: $data";

my $req = HTTP::Request->new(
  $method => $uri,
  $headers,
  $data
);
warn Dumper($req);

$self->request($req);
umuewwlo

umuewwlo2#

检查请求头的配置,确保Content_Type(例如application/json;charset=utf-8)与您的内容(即您的发布数据)相同。

相关问题