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 <[email protected]> Date: Tuesday, October 18, 2016 at 09:58 To: Kit Peters <[email protected]> Cc: Mark Overmeer <[email protected]>, "[email protected]" <[email protected]> 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 <[email protected]> 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 <[email protected]> Date: Monday, October 17, 2016 at 18:55 To: Kit Peters <[email protected]> Cc: Mark Overmeer <[email protected]>, "[email protected]" <[email protected]> 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 <[email protected]> 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" <[email protected]> wrote: * Kit Peters ([email protected]) [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 [email protected] [email protected] http://Mark.Overmeer.net http://solutions.overmeer.net _______________________________________________ Xml-compile mailing list [email protected] http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/xml-compile _______________________________________________ Xml-compile mailing list [email protected] http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/xml-compile
