This section provides a tutorial example on how to override the constant DEFAULT_HTTP_CONTENT_TYPE in the SOAP::Lite module to use 'application/soap+xml' for SOAP 1.2.
At this point, the last issue of using SOAP::Lite to call the SOAP 1.2 GetSpeech Web service
is to set the "application/soap+xml" as the media type in the Content-Type header line.
How should I do this? The SOAP::Lite manual does not offer any explicit method for
me to reset Content-Type header line.
I did some research on the Internet, and found no suggestions on how to control Content-Type
with SOAP::Lite.
So I had to read the source code of SOAP::Lite and related modules.
If you open \local\Perl\site\lib\SOAP\Transport\HTTP.pm, you will see this code segment:
This logic says, if $http_request->content_type is defined explicitly, use it as is.
Otherwise, built it based on the constant, $SOAP::Constants::DEFAULT_HTTP_CONTENT_TYPE.
If my understanding is correct, my first option is to fix the constant DEFAULT_HTTP_CONTENT_TYPE.
If you open \local\Perl\site\lib\SOAP\Constants.pm, you will see this section:
Obviously, I can reset this constant after I run $client->soapversion('1.2')
like this:
#- GetSpeech_Default_HTTP_Content_Type.pl
#- Copyright (c) 2009 by Dr. Herong Yang, herongyang.com
#- All rights reserved
#
use SOAP::Lite +trace;
my $client = SOAP::Lite->new()
->soapversion('1.2')
->envprefix('soap12')
->default_ns('http://xmlme.com/WebServices')
->on_action( sub {join '/', @_} )
->readable(true)
->proxy('http://localhost/WSShakespeare.asmx');
#- Overriding the constant
$SOAP::Constants::DEFAULT_HTTP_CONTENT_TYPE
= 'application/soap+xml';
my $som = $client->call('GetSpeech',
SOAP::Data->name("Request")
->value("To be, or not to be")
);
It worked! Remember you must override DEFAULT_HTTP_CONTENT_TYPE
after calling soapversion('1.2'), not before.
soapversion('1.2') triggers the 1.2 version of constants to be used.