I’m working with SOAP::WSDL and another company’s custom WSDL file. Every time they make a change for me and I recreate my modules, something breaks. Finding the problem is rather tedious because I don’t find a proper way to access the actual request that is sent to the SOAP server.
The only way to get to the request so far has been to use tcpdump in conjunction with wireshark to extract the request and result. That works, but since I don’t have root privileges on the dev machine I have to get an admin over every time I want to do that. I feel there must be another way to get to the HTTP::Request object inside the SOAP::WSDL thing. But if the server returns a fault, I don’t even have a response object, but rather a SOAP::WSDL::SOAP::Typelib::Fault11 object that has no visible relation to the request.
I’ve also tried using the debugger but I’m having trouble finding the actual request part. I’ve not yet understood how to tell the debuger to skip to a specific part deep inside a complex number of packages.
I found a way to at least print out the generated XML code.
First, I looked at SOAP::WSDL::Client as raina77ow suggested. That wasn’t what I needed, though. But then I came across SOAP::WSDL::Factory::Serializer. There, it says:
A little fidgeting and I came up with a wrapper class for SOAP::WSDL::Serializer::XSD which is the default serializer used by SOAP::WSDL. A look at the code helped, too.
Here’s the module I wrote. It uses
SOAP::WSDL::Serializer::XSDas a base class and overloads thenewandserializemethods. While it only passes arguments tonew, it grabs the returned XML fromserializeand prints it, which suffices for debugging. I’m not sure if there’s a way to put it somewhere I can easily get it from.And here’s how I call it:
It’s easy to deactivate. Only put a comment in the
set_serializerline.Of course printing a block of XML to the command line is not very pretty, but it gets the job done. I only need it once in a while why coding/testing, so this is fine I guess.