SOAP-Lite
view release on metacpan or search on metacpan
</soap:Envelope>
use_prefix(boolean)
Deprecated. Use the "ns()" and "default_ns" methods described above.
Shortcut for "serializer->use_prefix()". This lets you turn on/off
the use of a namespace prefix for the children of the /Envelope/Body
element. Default is 'true'.
When use_prefix is set to 'true', serialized XML will look like
this:
<SOAP-ENV:Envelope ...attributes skipped>
<SOAP-ENV:Body>
<namesp1:mymethod xmlns:namesp1="urn:MyURI" />
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
When use_prefix is set to 'false', serialized XML will look like
this:
<SOAP-ENV:Envelope ...attributes skipped>
<SOAP-ENV:Body>
<mymethod xmlns="urn:MyURI" />
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Some .NET web services have been reported to require this XML
namespace idiom.
soapversion(optional value)
$client->soapversion('1.2');
If no parameter is given, returns the current version of SOAP that
is being used by the client object to encode requests. If a
parameter is given, the method attempts to set that as the version
of SOAP being used.
The value should be either 1.1 or 1.2.
envprefix(QName)
$client->envprefix('env');
This method is a shortcut for:
$client->serializer->envprefix(QName);
Gets or sets the namespace prefix for the SOAP namespace. The
default is SOAP.
The prefix itself has no meaning, but applications may wish to chose
one explicitly to denote different versions of SOAP or the like.
encprefix(QName)
$client->encprefix('enc');
This method is a shortcut for:
$client->serializer->encprefix(QName);
Gets or sets the namespace prefix for the encoding rules namespace.
The default value is SOAP-ENC.
While it may seem to be an unnecessary operation to set a value that
isn't relevant to the message, such as the namespace labels for the
envelope and encoding URNs, the ability to set these labels explicitly
can prove to be a great aid in distinguishing and debugging messages on
the server side of operations.
encoding(encoding URN)
$client->encoding($soap_12_encoding_URN);
This method is a shortcut for:
$client->serializer->encoding(args);
Where the earlier method dealt with the label used for the
attributes related to the SOAP encoding scheme, this method actually
sets the URN to be specified as the encoding scheme for the message.
The default is to specify the encoding for SOAP 1.1, so this is
handy for applications that need to encode according to SOAP 1.2
rules.
typelookup
$client->typelookup;
This method is a shortcut for:
$client->serializer->typelookup;
Gives the application access to the type-lookup table from the
serializer object. See the section on SOAP::Serializer.
uri(service specifier)
Deprecated - the "uri" subroutine is deprecated in order to provide
a more intuitive naming scheme for subroutines that set namespaces.
In the future, you will be required to use either the "ns()" or
"default_ns()" subroutines instead of "uri()".
$client->uri($service_uri);
This method is a shortcut for:
$client->serializer->uri(service);
The URI associated with this accessor on a client object is the
service-specifier for the request, often encoded for HTTP-based
requests as the SOAPAction header. While the names may seem
confusing, this method doesn't specify the endpoint itself. In most
circumstances, the "uri" refers to the namespace used for the
request.
Often times, the value may look like a valid URL. Despite this, it
doesn't have to point to an existing resource (and often doesn't).
This method sets and retrieves this value from the object. Note that
no transport code is triggered by this because it has no direct
effect on the transport of the object.
multirefinplace(boolean)
$client->multirefinplace(1);
This method is a shortcut for:
$client->serializer->multirefinplace(boolean);
Controls how the serializer handles values that have multiple
references to them. Recall from previous SOAP chapters that a value
may be tagged with an identifier, then referred to in several
places. When this is the case for a value, the serializer defaults
to putting the data element towards the top of the message, right
after the opening tag of the method-specification. It is serialized
as a standalone entity with an ID that is then referenced at the
relevant places later on. If this method is used to set a true
value, the behavior is different. When the multirefinplace attribute
is true, the data is serialized at the first place that references
it, rather than as a separate element higher up in the body. This is
more compact but may be harder to read or trace in a debugging
environment.
parts( ARRAY )
Used to specify an array of MIME::Entity's to be attached to the
transmitted SOAP message. Attachments that are returned in a
response can be accessed by "SOAP::SOM::parts()".
self
$ref = SOAP::Lite->self;
Returns an object reference to the default global object the
"SOAP::Lite" package maintains. This is the object that processes
many of the arguments when provided on the use line.
The following method isn't an accessor style of method but neither does
it fit with the group that immediately follows it:
call(arguments)
$client->call($method => @arguments);
As has been illustrated in previous chapters, the "SOAP::Lite"
client objects can manage remote calls with auto-dispatching using
some of Perl's more elaborate features. call is used when the
application wants a greater degree of control over the details of
the call itself. The method may be built up from a SOAP::Data
object, so as to allow full control over the namespace associated
with the tag, as well as other attributes like encoding. This is
also important for calling methods that contain characters not
allowable in Perl function names, such as A.B.C.
The next four methods used in the "SOAP::Lite" class are geared towards
handling the types of events than can occur during the message
lifecycle. Each of these sets up a callback for the event in question:
on_action(callback)
$client->on_action(sub { qq("$_[0]") });
Triggered when the transport object sets up the SOAPAction header
for an HTTP-based call. The default is to set the header to the
string, uri#method, in which URI is the value set by the uri method
described earlier, and method is the name of the method being
called. When called, the routine referenced (or the closure, if
specified as in the example) is given two arguments, uri and method,
in that order.
.NET web services usually expect "/" as separator for "uri" and
"method". To change SOAP::Lite's behaviour to use uri/method as
SOAPAction header, use the following code:
$client->on_action( sub { join '/', @_ } );
=item on_fault(callback)
$client->on_fault(sub { popup_dialog($_[1]) });
Triggered when a method call results in a fault response from the
server. When it is called, the argument list is first the client
object itself, followed by the object that encapsulates the fault.
In the example, the fault object is passed (without the client
object) to a hypothetical GUI function that presents an error dialog
with the text of fault extracted from the object (which is covered
shortly under the SOAP::SOM methods).
on_nonserialized(callback)
$client->on_nonserialized(sub { die "$_[0]?!?" });
Occasionally, the serializer may be given data it can't turn into
SOAP-savvy XML; for example, if a program bug results in a code
reference or something similar being passed in as a parameter to
method call. When that happens, this callback is activated, with one
argument. That argument is the data item that could not be
understood. It will be the only argument. If the routine returns,
the return value is pasted into the message as the serialization.
Generally, an error is in order, and this callback allows for
control over signaling that error.
on_debug(callback)
$client->on_debug(sub { print @_ });
Deprecated. Use the global +debug and +trace facilities described in
SOAP::Trace
Note that this method will not work as expected: Instead of
affecting the debugging behaviour of the object called on, it will
globally affect the debugging behaviour for all objects of that
class.
WRITING A SOAP CLIENT
This chapter guides you to writing a SOAP client by example.
The SOAP service to be accessed is a simple variation of the well-known
hello world program. It accepts two parameters, a name and a given name,
and returns "Hello $given_name $name".
We will use "Martin Kutter" as the name for the call, so all variants
will print the following message on success:
Hello Martin Kutter!
SOAP message styles
There are three common (and one less common) variants of SOAP messages.
These address the message style (positional parameters vs. specified
message documents) and encoding (as-is vs. typed).
The different message styles are:
* rpc/encoded
Typed, positional parameters. Widely used in scripting languages.
The type of the arguments is included in the message. Arrays and the
like may be encoded using SOAP encoding rules (or others).
* rpc/literal
As-is, positional parameters. The type of arguments is defined by
some pre-exchanged interface definition.
* document/encoded
Specified message with typed elements. Rarely used.
* document/literal
Specified message with as-is elements. The message specification and
element types are defined by some pre-exchanged interface
definition.
As of 2008, document/literal has become the predominant SOAP message
variant. rpc/literal and rpc/encoded are still in use, mainly with
scripting languages, while document/encoded is hardly used at all.
You will see clients for the rpc/encoded and document/literal SOAP
variants in this section.
Example implementations
RPC/ENCODED
Rpc/encoded is most popular with scripting languages like perl, php and
python without the use of a WSDL. Usual method descriptions look like
this:
Method: sayHello(string, string)
Parameters:
name: string
givenName: string
Such a description usually means that you can call a method named
"sayHello" with two positional parameters, "name" and "givenName", which
both are strings.
The message corresponding to this description looks somewhat like this:
<sayHello xmlns="urn:HelloWorld">
<s-gensym01 xsi:type="xsd:string">Kutter</s-gensym01>
<s-gensym02 xsi:type="xsd:string">Martin</s-gensym02>
</sayHello>
Any XML tag names may be used instead of the "s-gensym01" stuff -
parameters are positional, the tag names have no meaning.
A client producing such a call is implemented like this:
use SOAP::Lite;
my $soap = SOAP::Lite->new( proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl');
$soap->default_ns('urn:HelloWorld');
my $som = $soap->call('sayHello', 'Kutter', 'Martin');
die $som->faultstring if ($som->fault);
print $som->result, "\n";
You can of course use a one-liner, too...
Sometimes, rpc/encoded interfaces are described with WSDL definitions. A
WSDL accepting "named" parameters with rpc/encoded looks like this:
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s0="urn:HelloWorld"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema targetNamespace="urn:HelloWorld">
</s:schema>
</types>
<message name="sayHello">
<part name="name" type="s:string" />
<part name="givenName" type="s:string" />
</message>
<message name="sayHelloResponse">
<part name="sayHelloResult" type="s:string" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHello" />
<output message="s0:sayHelloResponse" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="rpc" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"/>
<input>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="HelloWorld">
<port name="HelloWorldSoap" binding="s0:Service1Soap">
<soap:address location="http://localhost:81/soap-wsdl-test/helloworld.pl" />
</port>
</service>
</definitions>
The message corresponding to this schema looks like this:
<sayHello xmlns="urn:HelloWorld">
<name xsi:type="xsd:string">Kutter</name>
<givenName xsi:type="xsd:string">Martin</givenName>
</sayHello>
A web service client using this schema looks like this:
use SOAP::Lite;
my $soap = SOAP::Lite->service("file:say_hello_rpcenc.wsdl");
eval { my $result = $soap->sayHello('Kutter', 'Martin'); };
if ($@) {
die $@;
}
print $som->result();
You may of course also use the following one-liner:
perl -MSOAP::Lite -e 'print SOAP::Lite->service("file:say_hello_rpcenc.wsdl")\
->sayHello('Kutter', 'Martin'), "\n";'
A web service client (without a service description) looks like this.
use SOAP::Lite;
my $soap = SOAP::Lite->new( proxy => 'http://localhost:81/soap-wsdl-test/helloworld.pl');
$soap->default_ns('urn:HelloWorld');
my $som = $soap->call('sayHello',
SOAP::Data->name('name')->value('Kutter'),
SOAP::Data->name('givenName')->value('Martin')
);
die $som->faultstring if ($som->fault);
print $som->result, "\n";
RPC/LITERAL
SOAP web services using the document/literal message encoding are
usually described by some Web Service Definition. Our web service has
the following WSDL description:
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s0="urn:HelloWorld"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema targetNamespace="urn:HelloWorld">
<s:complexType name="sayHello">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name"
type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="givenName"
type="s:string" nillable="1" />
</s:sequence>
</s:complexType>
<s:complexType name="sayHelloResponse">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="sayHelloResult"
type="s:string" />
</s:sequence>
</s:complexType>
</s:schema>
</types>
<message name="sayHello">
<part name="parameters" type="s0:sayHello" />
</message>
<message name="sayHelloResponse">
<part name="parameters" type="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHello" />
<output message="s0:sayHelloResponse" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="rpc" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"/>
<input>
<soap:body use="literal" namespace="urn:HelloWorld"/>
</input>
<output>
<soap:body use="literal" namespace="urn:HelloWorld"/>
</output>
</operation>
</binding>
<service name="HelloWorld">
<port name="HelloWorldSoap" binding="s0:Service1Soap">
<soap:address location="http://localhost:80//helloworld.pl" />
</port>
</service>
</definitions>
The XML message (inside the SOAP Envelope) look like this:
<ns0:sayHello xmlns:ns0="urn:HelloWorld">
<parameters>
<name>Kutter</name>
<givenName>Martin</givenName>
</parameters>
</ns0:sayHello>
<sayHelloResponse xmlns:ns0="urn:HelloWorld">
<parameters>
<sayHelloResult>Hello Martin Kutter!</sayHelloResult>
</parameters>
</sayHelloResponse>
This is the SOAP::Lite implementation for the web service client:
use SOAP::Lite +trace;
my $soap = SOAP::Lite->new( proxy => 'http://localhost:80/helloworld.pl');
$soap->on_action( sub { "urn:HelloWorld#sayHello" });
$soap->autotype(0)->readable(1);
$soap->default_ns('urn:HelloWorld');
my $som = $soap->call('sayHello', SOAP::Data->name('parameters')->value(
\SOAP::Data->value([
SOAP::Data->name('name')->value( 'Kutter' ),
SOAP::Data->name('givenName')->value('Martin'),
]))
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
DOCUMENT/LITERAL
SOAP web services using the document/literal message encoding are
usually described by some Web Service Definition. Our web service has
the following WSDL description:
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s0="urn:HelloWorld"
targetNamespace="urn:HelloWorld"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema targetNamespace="urn:HelloWorld">
<s:element name="sayHello">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="givenName" type="s:string" nillable="1" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="sayHelloResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="sayHelloResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</types>
<message name="sayHelloSoapIn">
<part name="parameters" element="s0:sayHello" />
</message>
<message name="sayHelloSoapOut">
<part name="parameters" element="s0:sayHelloResponse" />
</message>
<portType name="Service1Soap">
<operation name="sayHello">
<input message="s0:sayHelloSoapIn" />
<output message="s0:sayHelloSoapOut" />
</operation>
</portType>
<binding name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation name="sayHello">
<soap:operation soapAction="urn:HelloWorld#sayHello"/>
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="HelloWorld">
<port name="HelloWorldSoap" binding="s0:Service1Soap">
<soap:address location="http://localhost:80//helloworld.pl" />
</port>
</service>
</definitions>
clients.*
Client Code
print SOAP::Lite
->uri('http://localhost/My/Parameters')
->proxy('http://localhost/', options => {compress_threshold => 10000})
->echo(1 x 10000)
->result;
Server Code
my $server = SOAP::Transport::HTTP::CGI
->dispatch_to('My::Parameters')
->options({compress_threshold => 10000})
->handle;
For more information see COMPRESSION in HTTP::Transport.
SECURITY
For security reasons, the existing path for Perl modules (@INC) will be
disabled once you have chosen dynamic deployment and specified your own
"PATH/". If you wish to access other modules in your included package
you have several options:
1 Switch to static linking:
use MODULE;
$server->dispatch_to('MODULE');
Which can also be useful when you want to import something specific
from the deployed modules:
use MODULE qw(import_list);
2 Change "use" to "require". The path is only unavailable during the
initialization phase. It is available once more during execution.
Therefore, if you utilize "require" somewhere in your package, it
will work.
3 Wrap "use" in an "eval" block:
eval 'use MODULE qw(import_list)'; die if $@;
4 Set your include path in your package and then specify "use". Don't
forget to put @INC in a "BEGIN{}" block or it won't work. For
example,
BEGIN { @INC = qw(my_directory); use MODULE }
INTEROPERABILITY
Microsoft .NET client with SOAP::Lite Server
In order to use a .NET client with a SOAP::Lite server, be sure you use
fully qualified names for your return values. For example:
return SOAP::Data->name('myname')
->type('string')
->uri($MY_NAMESPACE)
->value($output);
In addition see comment about default encoding in .NET Web Services
below.
SOAP::Lite client with a .NET server
If experiencing problems when using a SOAP::Lite client to call a .NET
Web service, it is recommended you check, or adhere to all of the
following recommendations:
Declare a proper soapAction in your call
For example, use "on_action( sub {
'http://www.myuri.com/WebService.aspx#someMethod'; } )".
Disable charset definition in Content-type header
Some users have said that Microsoft .NET prefers the value of the
Content-type header to be a mimetype exclusively, but SOAP::Lite
specifies a character set in addition to the mimetype. This results
in an error similar to:
Server found request content type to be 'text/xml; charset=utf-8',
but expected 'text/xml'
To turn off this behavior specify use the following code:
use SOAP::Lite;
$SOAP::Constants::DO_NOT_USE_CHARSET = 1;
# The rest of your code
Use fully qualified name for method parameters
For example, the following code is preferred:
SOAP::Data->name(Query => 'biztalk')
->uri('http://tempuri.org/')
As opposed to:
SOAP::Data->name('Query' => 'biztalk')
Place method in default namespace
For example, the following code is preferred:
my $method = SOAP::Data->name('add')
->attr({xmlns => 'http://tempuri.org/'});
my @rc = $soap->call($method => @parms)->result;
As opposed to:
my @rc = $soap->call(add => @parms)->result;
# -- OR --
my @rc = $soap->add(@parms)->result;
Disable use of explicit namespace prefixes
Some user's have reported that .NET will simply not parse messages
that use namespace prefixes on anything but SOAP elements
themselves. For example, the following XML would not be parsed:
<SOAP-ENV:Envelope ...attributes skipped>
<SOAP-ENV:Body>
<namesp1:mymethod xmlns:namesp1="urn:MyURI" />
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP::Lite allows users to disable the use of explicit namespaces
through the "use_prefix()" method. For example, the following code:
$som = SOAP::Lite->uri('urn:MyURI')
->proxy($HOST)
->use_prefix(0)
->myMethod();
Will result in the following XML, which is more palatable by .NET:
<SOAP-ENV:Envelope ...attributes skipped>
<SOAP-ENV:Body>
<mymethod xmlns="urn:MyURI" />
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Modify your .NET server, if possible
Stefan Pharies <stefanph@microsoft.com>:
SOAP::Lite uses the SOAP encoding (section 5 of the soap 1.1 spec),
and the default for .NET Web Services is to use a literal encoding.
So elements in the request are unqualified, but your service expects
them to be qualified. .Net Web Services has a way for you to change
the expected message format, which should allow you to get your
interop working. At the top of your class in the asmx, add this
attribute (for Beta 1):
[SoapService(Style=SoapServiceStyle.RPC)]
Another source said it might be this attribute (for Beta 2):
[SoapRpcService]
Full Web Service text may look like:
<%@ WebService Language="C#" Class="Test" %>
using System;
using System.Web.Services;
using System.Xml.Serialization;
[SoapService(Style=SoapServiceStyle.RPC)]
public class Test : WebService {
[WebMethod]
public int add(int a, int b) {
return a + b;
}
}
Another example from Kirill Gavrylyuk <kirillg@microsoft.com>:
"You can insert [SoapRpcService()] attribute either on your class or
on operation level".
<%@ WebService Language=CS class="DataType.StringTest"%>
namespace DataType {
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Services.Description;
[SoapRpcService()]
public class StringTest: WebService {
[WebMethod]
[SoapRpcMethod()]
public string RetString(string x) {
return(x);
}
}
}
Example from Yann Christensen <yannc@microsoft.com>:
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
namespace Currency {
[WebService(Namespace="http://www.yourdomain.com/example")]
[SoapRpcService]
Apache is crashing with segfaults
Using "SOAP::Lite" (or XML::Parser::Expat) in combination with
mod_perl causes random segmentation faults in httpd processes. To
fix, try configuring Apache with the following:
RULE_EXPAT=no
If you are using Apache 1.3.20 and later, try configuring Apache
with the following option:
./configure --disable-rule=EXPAT
See http://archive.covalent.net/modperl/2000/04/0185.xml for more
details and lot of thanks to Robert Barta <rho@bigpond.net.au> for
explaining this weird behavior.
If this doesn't address the problem, you may wish to try
"-Uusemymalloc", or a similar option in order to instruct Perl to
use the system's own "malloc".
Thanks to Tim Bunce <Tim.Bunce@pobox.com>.
CGI scripts do not work under Microsoft Internet Information Server
(IIS)
CGI scripts may not work under IIS unless scripts use the ".pl"
extension, opposed to ".cgi".
Java SAX parser unable to parse message composed by SOAP::Lite
In some cases SOAP messages created by "SOAP::Lite" may not be
parsed properly by a SAX2/Java XML parser. This is due to a known
bug in "org.xml.sax.helpers.ParserAdapter". This bug manifests
itself when an attribute in an XML element occurs prior to the XML
namespace declaration on which it depends. However, according to the
XML specification, the order of these attributes is not significant.
http://www.megginson.com/SAX/index.html
Thanks to Steve Alpert (Steve_Alpert@idx.com) for pointing on it.
PERFORMANCE
Processing of XML encoded fragments
"SOAP::Lite" is based on XML::Parser which is basically wrapper
around James Clark's expat parser. Expat's behavior for parsing XML
encoded string can affect processing messages that have lot of
encoded entities, like XML fragments, encoded as strings. Providing
low-level details, parser will call char() callback for every
portion of processed stream, but individually for every processed
entity or newline. It can lead to lot of calls and additional memory
manager expenses even for small messages. By contrast, XML messages
which are encoded as base64Binary, don't have this problem and
difference in processing time can be significant. For XML encoded
string that has about 20 lines and 30 tags, number of call could be
about 100 instead of one for the same string encoded as
base64Binary.
Since it is parser's feature there is NO fix for this behavior (let
me know if you find one), especially because you need to parse
message you already got (and you cannot control content of this
message), however, if your are in charge for both ends of processing
you can switch encoding to base64 on sender's side. It will
definitely work with SOAP::Lite and it may work with other
toolkits/implementations also, but obviously I cannot guarantee
that.
If you want to encode specific string as base64, just do
"SOAP::Data->type(base64 => $string)" either on client or on server
side. If you want change behavior for specific instance of
SOAP::Lite, you may subclass "SOAP::Serializer", override
"as_string()" method that is responsible for string encoding (take a
look into "as_base64Binary()") and specify new serializer class for
your SOAP::Lite object with:
my $soap = new SOAP::Lite
serializer => My::Serializer->new,
..... other parameters
or on server side:
my $server = new SOAP::Transport::HTTP::Daemon # or any other server
serializer => My::Serializer->new,
..... other parameters
If you want to change this behavior for all instances of SOAP::Lite,
just substitute "as_string()" method with "as_base64Binary()"
somewhere in your code after "use SOAP::Lite" and before actual
processing/sending:
*SOAP::Serializer::as_string = \&SOAP::XMLSchema2001::Serializer::as_base64Binary;
Be warned that last two methods will affect all strings and convert
them into base64 encoded. It doesn't make any difference for
SOAP::Lite, but it may make a difference for other toolkits.
BUGS AND LIMITATIONS
* No support for multidimensional, partially transmitted and sparse
arrays (however arrays of arrays are supported, as well as any other
data structures, and you can add your own implementation with
SOAP::Data).
* Limited support for WSDL schema.
* XML::Parser::Lite relies on Unicode support in Perl and doesn't do
entity decoding.
* Limited support for mustUnderstand and Actor attributes.
PLATFORM SPECIFICS
MacOS
Information about XML::Parser for MacPerl could be found here:
http://bumppo.net/lists/macperl-modules/1999/07/msg00047.html
Compiled XML::Parser for MacOS could be found here:
http://www.perl.com/CPAN-local/authors/id/A/AS/ASANDSTRM/XML-Parser-
2.27-bin-1-MacOS.tgz
RELATED MODULES
Transport Modules
SOAP::Lite allows one to add support for additional transport protocols,
or server handlers, via separate modules implementing the
SOAP::Transport::* interface. The following modules are available from
CPAN:
* SOAP-Transport-HTTP-Nginx
SOAP::Transport::HTTP::Nginx provides a transport module for nginx
(<http://nginx.net/>)
( run in 0.576 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )