[Xml-compile] XOP with XML::Compile::WSDL11
Kit Peters
Kit.Peters at broadbean.com
Tue Oct 18 15:02:07 GMT 2016
Ah! My question was not how to *get* the base64 encoding, but how to *avoid* same. ☺
--
Kit Peters
Doer of Things, ATS Integrations
D: +1 949 793 8208 M: +1 816 200 0279
From: Christopher Taranto <christopher at tokpela.com>
Date: Tuesday, October 18, 2016 at 09:58
To: Kit Peters <Kit.Peters at broadbean.com>
Cc: Mark Overmeer <mark at overmeer.net>, "xml-compile at lists.scsys.co.uk" <xml-compile at lists.scsys.co.uk>
Subject: Re: [Xml-compile] XOP with XML::Compile::WSDL11
Hi Kit,
You do not need to do any formatting - just add the data to the data structure. XML::Compile will take care of the Base64 encoding.
I created the data structure using explain method from the XML::Compile::WSDL11 module.
Creating the request looks something like this:
my %Request;
$Request{TransactionId} = $transaction_number;
$Request{SenderInfo} = \%SenderInfo;
$Request{Document} = \%Document;
my @result = (parameters => { Request => \%Request });
And, here is the script that I used to generate the data structure using explain.
use strict;
use warnings;
use XML::Compile::WSDL11; # use WSDL version 1.1
use XML::Compile::SOAP11; # use SOAP version 1.1
use XML::Compile::Transport::SOAPHTTP;
use XML::Compile::XOP;
my $explain_input_file = 'input.txt';
my $explain_output_file = 'output.txt';
my $wsdl = XML::Compile::WSDL11->new('SERVICE.WSDL');
$wsdl->importDefinitions('XMLMimeTypes.xsd');
$wsdl->importDefinitions('SERVICE.XSD');
my $call = $wsdl->compileClient('UploadOperation');
if (open(my $ifh, '>', $explain_input_file)) {
print $ifh $wsdl->explain('UploadOperation', PERL => 'INPUT', recurse => 1);
close($ifh);
} else {
die "[Error] UNABLE TO OPEN [$explain_input_file] - [$!]";
}
if (open(my $ofh, '>', $explain_output_file)) {
print $ofh $wsdl->explain('UploadOperation', PERL => 'OUTPUT', recurse => 1);
close($ofh);
} else {
die "[Error] UNABLE TO OPEN [$explain_output_file] - [$!]";
}
print "Done\n";
On Tue, Oct 18, 2016 at 7:23 AM, Kit Peters <Kit.Peters at broadbean.com> wrote:
What do your @request_params look like there? Because I’m not seeing anywhere that your request is being formatted as XOP/MTOM.
KP
--
Kit Peters
Doer of Things, ATS Integrations
D: +1 949 793 8208 M: +1 816 200 0279
From: Christopher Taranto <christopher at tokpela.com>
Date: Monday, October 17, 2016 at 18:55
To: Kit Peters <Kit.Peters at broadbean.com>
Cc: Mark Overmeer <mark at overmeer.net>, "xml-compile at lists.scsys.co.uk" <xml-compile at lists.scsys.co.uk>
Subject: Re: [Xml-compile] XOP with XML::Compile::WSDL11
Hi Kip,
@Hi Mark!
I've been using XOP for a few years in Production with XML::Compile in two different scripts.
It's been a while since I had to put this together so I don't remember the particulars.
The below code is not the working code - as it is separated behind objects etc - but I think I have patched together the general theme:
I hope this helps!
Chris
use XML::Compile::WSDL11; # use WSDL version 1.1
use XML::Compile::SOAP11; # use SOAP version 1.1
use XML::Compile::Transport::SOAPHTTP;
use XML::Compile::XOP;
my $xml_compile = XML::Compile::WSDL11->new($primary_wsdl,
schema_dirs => \@schema_dirs)
|| die "[Error] UNABLE TO CREATE XML::Compile::WSDL11 OBJECT";
foreach (@wsdls) {
$xml_compile->addWSDL($_);
}
foreach (@schemas) {
$xml_compile->importDefinitions($_);
}
# setup the XML::Compile transport for HTTP with the LWP user_agent
my $ua = LWP::UserAgent->new(keep_alive => 1);
if ($jar_file) {
$ua->cookie_jar( {file => $jar_file,
autosave => 1,
ignore_discard => 1 });
}
my $transport = XML::Compile::Transport::SOAPHTTP->new(user_agent => $ua,
soap => $self->soap_version);
# compile the client call
my $client_call = $xml_compile->compileClient($operation_name,
port => $service_port,
trans => $transport);
my ($answer, $trace, $xops);
eval {
($answer, $trace, $xops) = $client_call->(@request_params);
};
if ($@) {
die "[Error] UNABLE TO COMPLETE REQUEST: [$@] - ANSWER[$answer] - TRACE[$trace] - XOPS[$xops]";
}
On Mon, Oct 17, 2016 at 4:27 PM, Kit Peters <Kit.Peters at broadbean.com> wrote:
I tried that, like so (not actual code):
# $xml_content is <Attributes>…</Attributes><Content>…</Content>
my $xop = XML::Compile::XOP->new;
my $content = $xop->bytes( $xml_content, type => ‘text/xml’ );
# Call to submitLargeDocument has been compiled already
$wsdl->call( ‘submitLargeDocument’, parameters => { Document => $content } );
And when I look at the content just before it’s sent to the server, I don’t see that it’s being translated into MTOM. Instead I see:
<?xml version="1.0" encoding="UTF-8"?>
<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
<soap11:Header>
<wsa:MessageID xmlns:wsa="http://www.w3.org/2005/03/addressing">Query-Export-5490E6F8-94BE-11E6-9A62-DBB52521867A</wsa:MessageID>
<wsa:ReplyTo xmlns:wsa="http://www.w3.org/2005/03/addressing">
<wsa:Address>http://www.taleo.com/ws/integration/toolkit/2005/07/addressing/queue</wsa:Address>
</wsa:ReplyTo>
<wsa:Action xmlns:wsa="http://www.w3.org/2005/03/addressing">http://www.taleo.com/ws/integration/toolkit/2005/07/action/export</wsa:Action>
</soap11:Header>
<soap11:Body>
<tns0:submitLargeDocument xmlns:tns0="http://www.taleo.com/ws/integration/toolkit/2011/05/management" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tns0:Document><!-- # Long base64 string redacted --> tns0:Document>
</tns0:submitLargeDocument>
</soap11:Body>
</soap11:Envelope>
I expect this is happening because of the following element in the WSDL:
<xsd:element name="submitLargeDocument">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="Document" nillable="true" type="nsm:StreamBody" nsxmlmime:expectedContentTypes="application/octet-stream"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Am I doing the XOP right, and if so, how do I put this into MTOM, rather than just base64 encoding the XML fragment? Do I need to fiddle the WSDL somehow?
KP
--
Kit Peters
Doer of Things, ATS Integrations
D: +1 949 793 8208 M: +1 816 200 0279
On 10/17/16, 04:54, "Mark Overmeer" <mark at overmeer.net> wrote:
* Kit Peters (Kit.Peters at broadbean.com) [161014 15:33]:
> How do I make an XOP request using XML::Compile::WSDL11? I’ve seen
> the XOP unit test in XML::Compile::SOAP, but I’m not sure how to adapt
> that to a compiled call with XML::Compile::WSDL11.
Produce the XOP Include elements and put them in your data-tree on the
usual spot for that data. During the creation of the SOAP message,
it will get attached and replaced by the attachement reference.
--
greetz,
MarkOv
------------------------------------------------------------------------
Mark Overmeer MSc MARKOV Solutions
Mark at Overmeer.net solutions at overmeer.net
http://Mark.Overmeer.net http://solutions.overmeer.net
_______________________________________________
Xml-compile mailing list
Xml-compile at lists.scsys.co.uk
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/xml-compile
More information about the Xml-compile
mailing list