3

我正在使用SOAP::WSDL另一家公司的自定义 WSDL 文件。每次他们为我做出改变并且我重新创建我的模块时,都会出现一些问题。查找问题相当繁琐,因为我找不到正确的方法来访问发送到 SOAP 服务器的实际请求。

到目前为止,获取请求的唯一方法是结合使用 tcpdump 和 wireshark 来提取请求和结果。那行得通,但是由于我在开发机器上没有root权限,所以每次我想这样做时都必须让管理员过来。我觉得必须有另一种方法可以到达事物HTTP::Request内部的对象SOAP::WSDL。但是如果服务器返回一个错误,我什至没有响应对象,而是一个SOAP::WSDL::SOAP::Typelib::Fault11与请求没有可见关系的对象。

我也尝试过使用调试器,但我无法找到实际的请求部分。我还不明白如何告诉调试器跳到复杂数量的包深处的特定部分。

4

3 回答 3

4

我偶然发现了这个,我自己也有同样的问题。我发现答案是使用raina77ow 列出的两个选项。

$service->outputxml(1);

返回整个 SOAP 信封 xml,但这需要与

$service->no_dispatch(1);

设置 no_dispatch 后,将打印 SOAP 请求,而不是来自请求的回复。希望这可以帮助其他人。

于 2012-10-15T19:14:10.130 回答
2

您是否尝试过使用SOAP::WSDL::Client跟踪方法——尤其是outputxml?它返回要发送到服务器的原始 SOAP 信封。

您还可以使用SOAP::WSDL包的no_dispatch配置方法:

设置后,call() 返回纯请求 XML,而不是将 SOAP 调用分派给 SOAP 服务。便于测试/调试。

于 2012-04-30T09:32:01.370 回答
0

我找到了一种至少打印出生成的 XML 代码的方法。

首先,我按照 raina77ow 的建议查看了SOAP::WSDL::Client 。不过,这不是我需要的。但后来我遇到了SOAP::WSDL::Factory::Serializer。在那里,它说:

序列化器对象也可以通过使用 set_serializer 方法直接传递给 SOAP::WSDL::Client。

有点烦躁,我想出了一个SOAP::WSDL::Serializer::XSD的包装类,它是SOAP::WSDL使用的默认序列化程序。查看代码也有帮助。

这是我写的模块。它SOAP::WSDL::Serializer::XSD用作基类并重载newandserialize方法。虽然它只将参数传递给new,但它会从中获取返回的 XMLserialize并打印出来,这足以进行调试。我不确定是否有办法将它放在我可以轻松获取它的地方。

package MySerializer;
use strict;
use warnings;
use base qw(SOAP::WSDL::Serializer::XSD);

sub new {
  my $self = shift;
  my $class = ref($self) || $self;
  return $self if ref $self;

  # Create the base object and return it
  my $base_object = $class->SUPER::new(@_);
  return bless ($base_object, $class);
}

sub serialize {
  my ($self, $args_of_ref) = @_;

  # This is basically a wrapper function that calls the real Serializer's
  # serialize-method and grabs and prints the returned XML before it
  # giving it back to the caller

  my $xml = ref($self)->SUPER::serialize($args_of_ref);
  print "\n\n$xml\n\n"; # here we go
  return $xml;
}

1;

这就是我所说的:

my $serializer = MySerializer->new();
$self->{'_interface'} = Lib::Interfaces::MyInterface->new();
$self->{'_interface'}->set_serializer($serializer); # comment out to deactivate

很容易停用。仅在该set_serializer行中添加注释。

当然,将一段 XML 打印到命令行不是很漂亮,但它可以完成工作。我只是偶尔需要它为什么编码/测试,所以我猜这很好。

于 2012-05-02T07:17:07.503 回答