phpman > perldoc > SOAP::Lite(3pm)

Markdown | JSON | MCP    

NAME
    SOAP::Lite - Perl's Web Services Toolkit

DESCRIPTION
    SOAP::Lite is a collection of Perl modules which provides a simple and lightweight interface to
    the Simple Object Access Protocol (SOAP) both on client and server side.

PERL VERSION WARNING
    As of version SOAP::Lite version 1.05, no perl versions before 5.8 will be supported.

    SOAP::Lite 0.71 will be the last version of SOAP::Lite running on perl 5.005

    Future versions of SOAP::Lite will require at least perl 5.6.0

    If you have not had the time to upgrade your perl, you should consider this now.

OVERVIEW OF CLASSES AND PACKAGES
    lib/SOAP/Lite.pm
        SOAP::Lite - Main class provides all logic

        SOAP::Transport - Transport backend

        SOAP::Data - Data objects

        SOAP::Header - Header Data Objects

        SOAP::Serializer - Serializes data structures to SOAP messages

        SOAP::Deserializer - Deserializes SOAP messages into SOAP::SOM objects

        SOAP::SOM - SOAP Message objects

        SOAP::Constants - Provides access to common constants and defaults

        SOAP::Trace - Tracing facilities

        SOAP::Schema - Provides access and stub(s) for schema(s)

        SOAP::Schema::WSDL - WSDL implementation for SOAP::Schema

        SOAP::Server - Handles requests on server side

        SOAP::Server::Object - Handles objects-by-reference

        SOAP::Fault - Provides support for Faults on server side

        SOAP::Utils - A set of private and public utility subroutines

    lib/SOAP/Packager.pm
        SOAP::Packager - Provides an abstract class for implementing custom packagers.

        SOAP::Packager::MIME - Provides MIME support to SOAP::Lite

        SOAP::Packager::DIME - Provides DIME support to SOAP::Lite

    lib/SOAP/Transport/HTTP.pm
        SOAP::Transport::HTTP::Client - Client interface to HTTP transport

        SOAP::Transport::HTTP::Server - Server interface to HTTP transport

        SOAP::Transport::HTTP::CGI - CGI implementation of server interface

        SOAP::Transport::HTTP::Daemon - Daemon implementation of server interface

        SOAP::Transport::HTTP::Apache - mod_perl implementation of server interface

    lib/SOAP/Transport/POP3.pm
        SOAP::Transport::POP3::Server - Server interface to POP3 protocol

    lib/SOAP/Transport/MAILTO.pm
        SOAP::Transport::MAILTO::Client - Client interface to SMTP/sendmail

    lib/SOAP/Transport/LOCAL.pm
        SOAP::Transport::LOCAL::Client - Client interface to local transport

    lib/SOAP/Transport/TCP.pm
        SOAP::Transport::TCP::Server - Server interface to TCP protocol

        SOAP::Transport::TCP::Client - Client interface to TCP protocol

    lib/SOAP/Transport/IO.pm
        SOAP::Transport::IO::Server - Server interface to IO transport

METHODS
    All accessor methods return the current value when called with no arguments, while returning the
    object reference itself when called with a new value. This allows the set-attribute calls to be
    chained together.

    new(optional key/value pairs)
            $client = SOAP::Lite->new(proxy => $endpoint)

        Constructor. Many of the accessor methods defined here may be initialized at creation by
        providing their name as a key, followed by the desired value. The example provides the value
        for the proxy element of the client.

    transport(optional transport object)
            $transp = $client->transport( );

        Gets or sets the transport object used for sending/receiving SOAP messages.

        See SOAP::Transport for details.

    serializer(optional serializer object)
            $serial = $client->serializer( )

        Gets or sets the serializer object used for creating XML messages.

        See SOAP::Serializer for details.

    packager(optional packager object)
            $packager = $client->packager( )

        Provides access to the "SOAP::Packager" object that the client uses to manage the use of
        attachments. The default packager is a MIME packager, but unless you specify parts to send,
        no MIME formatting will be done.

        See also: SOAP::Packager.

    proxy(endpoint, optional extra arguments)
            $client->proxy('http://soap.xml.info/ endPoint');

        The proxy is the server or endpoint to which the client is going to connect. This method
        allows the setting of the endpoint, along with any extra information that the transport
        object may need when communicating the request.

        This method is actually an alias to the proxy method of SOAP::Transport. It is the same as
        typing:

            $client->transport( )->proxy(...arguments);

        Extra parameters can be passed to proxy() - see below.

        compress_threshold
            See COMPRESSION in HTTP::Transport.

        All initialization options from the underlying transport layer
            The options for HTTP(S) are the same as for LWP::UserAgent's new() method.

            A common option is to create a instance of HTTP::Cookies and pass it as cookie_jar
            option:

             my $cookie_jar = HTTP::Cookies->new()
             $client->proxy('http://www.example.org/webservice',
                cookie_jar => $cookie_jar,
             );

        For example, if you wish to set the HTTP timeout for a SOAP::Lite client to 5 seconds, use
        the following code:

          my $soap = SOAP::Lite
           ->uri($uri)
           ->proxy($proxyUrl, timeout => 5 );

        See LWP::UserAgent.

    endpoint(optional new endpoint address)
            $client->endpoint('http://soap.xml.info/ newPoint')

        It may be preferable to set a new endpoint without the additional work of examining the new
        address for protocol information and checking to ensure the support code is loaded and
        available. This method allows the caller to change the endpoint that the client is currently
        set to connect to, without reloading the relevant transport code. Note that the proxy method
        must have been called before this method is used.

    service(service URL)
            $client->service('http://svc.perl.org/Svc.wsdl');

        "SOAP::Lite" offers some support for creating method stubs from service descriptions. At
        present, only WSDL support is in place. This method loads the specified WSDL schema and uses
        it as the basis for generating stubs.

    outputxml(boolean)
            $client->outputxml('true');

        When set to a true value, the raw XML is returned by the call to a remote method.

        The default is to return a SOAP::SOM object (false).

    autotype(boolean)
            $client->autotype(0);

        This method is a shortcut for:

            $client->serializer->autotype(boolean);

        By default, the serializer tries to automatically deduce types for the data being sent in a
        message. Setting a false value with this method disables the behavior.

    readable(boolean)
            $client->readable(1);

        This method is a shortcut for:

            $client->serializer->readable(boolean);

        When this is used to set a true value for this property, the generated XML sent to the
        endpoint has extra characters (spaces and new lines) added in to make the XML itself more
        readable to human eyes (presumably for debugging). The default is to not send any additional
        characters.

    headerattr(hash reference of attributes)
            $obj->headerattr({ attr1 => 'value' });

        Allows for the setting of arbitrary attributes on the header object. Keep in mind the
        requirement that any attributes not natively known to SOAP must be namespace-qualified. If
        using $session->call ($method, $callData, $callHeader), SOAP::Lite serializes information as

          <soap:Envelope>
            <soap:Header>
              <userId>xxxxx</userId>
              <password>yyyyy</password>
            </soap:Header>
            <soap:Body>
              <myMethod xmlns="http://www.someuri.com">
                <foo />
              </myMethod>
            </soap:Body>
          </soap:Envelope>

        The attributes, given to headerattr are placed into the Header as

            <soap:Header attr1="value">

    bodyattr(hash reference of attributes)
            $obj->bodyattr({ attr1 => 'value' });

        Allows for the setting of arbitrary attributes on the body object. Keep in mind the
        requirement that any attributes not natively known to SOAP must be namespace-qualified. See
        headerattr

    default_ns($uri)
        Sets the default namespace for the request to the specified uri. This overrides any previous
        namespace declaration that may have been set using a previous call to "ns()" or
        "default_ns()". Setting the default namespace causes elements to be serialized without a
        namespace prefix, like this:

          <soap:Envelope>
            <soap:Body>
              <myMethod xmlns="http://www.someuri.com">
                <foo />
              </myMethod>
            </soap:Body>
          </soap:Envelope>

        Some .NET web services have been reported to require this XML namespace idiom.

    ns($uri,$prefix=undef)
        Sets the namespace uri and optionally the namespace prefix for the request to the specified
        values. This overrides any previous namespace declaration that may have been set using a
        previous call to "ns()" or "default_ns()".

        If a prefix is not specified, one will be generated for you automatically. Setting the
        namespace causes elements to be serialized with a declared namespace prefix, like this:

          <soap:Envelope>
            <soap:Body>
              <my:myMethod xmlns:my="http://www.someuri.com">
                <my:foo />
              </my:myMethod>
            </soap:Body>
          </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 '/', @_ } );

    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>

    The XML message (inside the SOAP Envelope) look like this:

     <sayHello xmlns="urn:HelloWorld">
       <name>Kutter</name>
       <givenName>Martin</givenName>
     </sayHello>

     <sayHelloResponse>
       <sayHelloResult>Hello Martin Kutter!</sayHelloResult>
     </sayHelloResponse>

    You can call this web service with the following client code:

     use SOAP::Lite;
     my $soap = SOAP::Lite->new( proxy => 'http://localhost:80/helloworld.pl');

     $soap->on_action( sub { "urn:HelloWorld#sayHello" });
     $soap->autotype(0);
     $soap->default_ns('urn:HelloWorld');

     my $som = $soap->call("sayHello",
        SOAP::Data->name('name')->value( 'Kutter' ),
        SOAP::Data->name('givenName')->value('Martin'),
    );

     die $som->fault->{ faultstring } if ($som->fault);
     print $som->result, "\n";

  Differences between the implementations
    You may have noticed that there's little difference between the rpc/encoded, rpc/literal and the
    document/literal example's implementation. In fact, from SOAP::Lite's point of view, the only
    differences between rpc/literal and document/literal that parameters are always named.

    In our example, the rpc/encoded variant already used named parameters (by using two messages),
    so there's no difference at all.

    You may have noticed the somewhat strange idiom for passing a list of named parameters in the
    rpc/literal example:

     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'),
        ]))
     );

    While SOAP::Data provides full control over the XML generated, passing hash-like structures
    require additional coding.

WRITING A SOAP SERVER
    See SOAP::Server, or SOAP::Transport.

FEATURES
  ATTACHMENTS
    "SOAP::Lite" features support for the SOAP with Attachments specification. Currently, SOAP::Lite
    only supports MIME based attachments. DIME based attachments are yet to be fully functional.

   EXAMPLES
   Client sending an attachment
    "SOAP::Lite" clients can specify attachments to be sent along with a request by using the
    "SOAP::Lite::parts()" method, which takes as an argument an ARRAY of "MIME::Entity"'s.

      use SOAP::Lite;
      use MIME::Entity;
      my $ent = build MIME::Entity
        Type        => "image/gif",
        Encoding    => "base64",
        Path        => "somefile.gif",
        Filename    => "saveme.gif",
        Disposition => "attachment";
      my $som = SOAP::Lite
        ->uri($SOME_NAMESPACE)
        ->parts([ $ent ])
        ->proxy($SOME_HOST)
        ->some_method(SOAP::Data->name("foo" => "bar"));

   Client retrieving an attachment
    A client accessing attachments that were returned in a response by using the
    "SOAP::SOM::parts()" accessor.

      use SOAP::Lite;
      use MIME::Entity;
      my $soap = SOAP::Lite
        ->uri($NS)
        ->proxy($HOST);
      my $som = $soap->foo();
      foreach my $part (${$som->parts}) {
        print $part->stringify;
      }

   Server receiving an attachment
    Servers, like clients, use the SOAP::SOM module to access attachments transmitted to it.

      package Attachment;
      use SOAP::Lite;
      use MIME::Entity;
      use strict;
      use vars qw(@ISA);
      @ISA = qw(SOAP::Server::Parameters);
      sub someMethod {
        my $self = shift;
        my $envelope = pop;
        foreach my $part (@{$envelope->parts}) {
          print "AttachmentService: attachment found! (".ref($part).")\n";
        }
        # do something
      }

   Server responding with an attachment
    Servers wishing to return an attachment to the calling client need only return "MIME::Entity"
    objects along with SOAP::Data elements, or any other data intended for the response.

      package Attachment;
      use SOAP::Lite;
      use MIME::Entity;
      use strict;
      use vars qw(@ISA);
      @ISA = qw(SOAP::Server::Parameters);
      sub someMethod {
        my $self = shift;
        my $envelope = pop;
        my $ent = build MIME::Entity
        'Id'          => "<1234>",
        'Type'        => "text/xml",
        'Path'        => "some.xml",
        'Filename'    => "some.xml",
        'Disposition' => "attachment";
        return SOAP::Data->name("foo" => "blah blah blah"),$ent;
      }

  DEFAULT SETTINGS
    Though this feature looks similar to autodispatch they have (almost) nothing in common. This
    capability allows you specify default settings so that all objects created after that will be
    initialized with the proper default settings.

    If you wish to provide common "proxy()" or "uri()" settings for all "SOAP::Lite" objects in your
    application you may do:

      use SOAP::Lite
        proxy => 'http://localhost/cgi-bin/soap.cgi',
        uri => 'http://my.own.com/My/Examples';

      my $soap1 = new SOAP::Lite; # will get the same proxy()/uri() as above
      print $soap1->getStateName(1)->result;

      my $soap2 = SOAP::Lite->new; # same thing as above
      print $soap2->getStateName(2)->result;

      # or you may override any settings you want
      my $soap3 = SOAP::Lite->proxy('http://localhost/');
      print $soap3->getStateName(1)->result;

    Any "SOAP::Lite" properties can be propagated this way. Changes in object copies will not affect
    global settings and you may still change global settings with "SOAP::Lite->self" call which
    returns reference to global object. Provided parameter will update this object and you can even
    set it to "undef":

      SOAP::Lite->self(undef);

    The "use SOAP::Lite" syntax also lets you specify default event handlers for your code. If you
    have different SOAP objects and want to share the same "on_action()" (or "on_fault()" for that
    matter) handler. You can specify "on_action()" during initialization for every object, but you
    may also do:

      use SOAP::Lite
        on_action => sub {sprintf '%s#%s', @_};

    and this handler will be the default handler for all your SOAP objects. You can override it if
    you specify a handler for a particular object. See t/*.t for example of on_fault() handler.

    Be warned, that since "use ..." is executed at compile time all "use" statements will be
    executed before script execution that can make unexpected results. Consider code:

      use SOAP::Lite proxy => 'http://localhost/';
      print SOAP::Lite->getStateName(1)->result;

      use SOAP::Lite proxy => 'http://localhost/cgi-bin/soap.cgi';
      print SOAP::Lite->getStateName(1)->result;

    Both SOAP calls will go to 'http://localhost/cgi-bin/soap.cgi'. If you want to execute "use" at
    run-time, put it in "eval":

      eval "use SOAP::Lite proxy => 'http://localhost/cgi-bin/soap.cgi'; 1" or die;

    Or alternatively,

      SOAP::Lite->self->proxy('http://localhost/cgi-bin/soap.cgi');

  SETTING MAXIMUM MESSAGE SIZE
    One feature of "SOAP::Lite" is the ability to control the maximum size of a message a SOAP::Lite
    server will be allowed to process. To control this feature simply define
    $SOAP::Constants::MAX_CONTENT_SIZE in your code like so:

      use SOAP::Transport::HTTP;
      use MIME::Entity;
      $SOAP::Constants::MAX_CONTENT_SIZE = 10000;
      SOAP::Transport::HTTP::CGI
        ->dispatch_to('TemperatureService')
        ->handle;

  IN/OUT, OUT PARAMETERS AND AUTOBINDING
    "SOAP::Lite" gives you access to all parameters (both in/out and out) and also does some
    additional work for you. Lets consider following example:

      <mehodResponse>
        <res1>name1</res1>
        <res2>name2</res2>
        <res3>name3</res3>
      </mehodResponse>

    In that case:

      $result = $r->result; # gives you 'name1'
      $paramout1 = $r->paramsout;      # gives you 'name2', because of scalar context
      $paramout1 = ($r->paramsout)[0]; # gives you 'name2' also
      $paramout2 = ($r->paramsout)[1]; # gives you 'name3'

    or

      @paramsout = $r->paramsout; # gives you ARRAY of out parameters
      $paramout1 = $paramsout[0]; # gives you 'res2', same as ($r->paramsout)[0]
      $paramout2 = $paramsout[1]; # gives you 'res3', same as ($r->paramsout)[1]

    Generally, if server returns "return (1,2,3)" you will get 1 as the result and 2 and 3 as out
    parameters.

    If the server returns "return [1,2,3]" you will get an ARRAY reference from "result()" and
    "undef" from "paramsout()".

    Results can be arbitrary complex: they can be an array references, they can be objects, they can
    be anything and still be returned by "result()" . If only one parameter is returned,
    "paramsout()" will return "undef".

    Furthermore, if you have in your output parameters a parameter with the same signature
    (name+type) as in the input parameters this parameter will be mapped into your input
    automatically. For example:

    Server Code:

      sub mymethod {
        shift; # object/class reference
        my $param1 = shift;
        my $param2 = SOAP::Data->name('myparam' => shift() * 2);
        return $param1, $param2;
      }

    Client Code:

      $a = 10;
      $b = SOAP::Data->name('myparam' => 12);
      $result = $soap->mymethod($a, $b);

    After that, "$result == 10 and $b->value == 24"! Magic? Sort of.

    Autobinding gives it to you. That will work with objects also with one difference: you do not
    need to worry about the name and the type of object parameter. Consider the "PingPong" example
    (examples/My/PingPong.pm and examples/pingpong.pl):

    Server Code:

      package My::PingPong;

      sub new {
        my $self = shift;
        my $class = ref($self) || $self;
        bless {_num=>shift} => $class;
      }

      sub next {
        my $self = shift;
        $self->{_num}++;
      }

    Client Code:

      use SOAP::Lite +autodispatch =>
        uri => 'urn:',
        proxy => 'http://localhost/';

      my $p = My::PingPong->new(10); # $p->{_num} is 10 now, real object returned
      print $p->next, "\n";          # $p->{_num} is 11 now!, object autobinded

  STATIC AND DYNAMIC SERVICE DEPLOYMENT
    Let us scrutinize the deployment process. When designing your SOAP server you can consider two
    kind of deployment: static and dynamic. For both, static and dynamic, you should specify
    "MODULE", "MODULE::method", "method" or "PATH/" when creating "use"ing the SOAP::Lite module.
    The difference between static and dynamic deployment is that in case of 'dynamic', any module
    which is not present will be loaded on demand. See the "SECURITY" section for detailed
    description.

    When statically deploying a SOAP Server, you need to know all modules handling SOAP requests
    before.

    Dynamic deployment allows extending your SOAP Server's interface by just installing another
    module into the dispatch_to path (see below).

   STATIC DEPLOYMENT EXAMPLE
      use SOAP::Transport::HTTP;
      use My::Examples;           # module is preloaded

      SOAP::Transport::HTTP::CGI
         # deployed module should be present here or client will get
         # 'access denied'
        -> dispatch_to('My::Examples')
        -> handle;

    For static deployment you should specify the MODULE name directly.

    You should also use static binding when you have several different classes in one file and want
    to make them available for SOAP calls.

   DYNAMIC DEPLOYMENT EXAMPLE
      use SOAP::Transport::HTTP;
      # name is unknown, module will be loaded on demand

      SOAP::Transport::HTTP::CGI
        # deployed module should be present here or client will get 'access denied'
        -> dispatch_to('/Your/Path/To/Deployed/Modules', 'My::Examples')
        -> handle;

    For dynamic deployment you can specify the name either directly (in that case it will be
    "require"d without any restriction) or indirectly, with a PATH. In that case, the ONLY path that
    will be available will be the PATH given to the dispatch_to() method). For information how to
    handle this situation see "SECURITY" section.

   SUMMARY
      dispatch_to(
        # dynamic dispatch that allows access to ALL modules in specified directory
        PATH/TO/MODULES
        # 1. specifies directory
        # -- AND --
        # 2. gives access to ALL modules in this directory without limits

        # static dispatch that allows access to ALL methods in particular MODULE
        MODULE
        #  1. gives access to particular module (all available methods)
        #  PREREQUISITES:
        #    module should be loaded manually (for example with 'use ...')
        #    -- OR --
        #    you can still specify it in PATH/TO/MODULES

        # static dispatch that allows access to particular method ONLY
        MODULE::method
        # same as MODULE, but gives access to ONLY particular method,
        # so there is not much sense to use both MODULE and MODULE::method
        # for the same MODULE
      );

    In addition to this "SOAP::Lite" also supports an experimental syntax that allows you to bind a
    specific URL or SOAPAction to a CLASS/MODULE or object.

    For example:

      dispatch_with({
        URI => MODULE,        # 'http://www.soaplite.com/' => 'My::Class',
        SOAPAction => MODULE, # 'http://www.soaplite.com/method' => 'Another::Class',
        URI => object,        # 'http://www.soaplite.com/obj' => My::Class->new,
      })

    "URI" is checked before "SOAPAction". You may use both the "dispatch_to()" and "dispatch_with()"
    methods in the same server, but note that "dispatch_with()" has a higher order of precedence.
    "dispatch_to()" will be checked only after "URI" and "SOAPAction" has been checked.

    See also: EXAMPLE APACHE::REGISTRY USAGE, "SECURITY"

  COMPRESSION
    "SOAP::Lite" provides you option to enable transparent compression over the wire. Compression
    can be enabled by specifying a threshold value (in the form of kilobytes) for compression on
    both the client and server sides:

    *Note: Compression currently only works for HTTP based servers and 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 AT 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 AT 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 AT microsoft.com>:

          using System;
          using System.Web.Services;
          using System.Web.Services.Protocols;

          namespace Currency {
            [WebService(Namespace="http://www.yourdomain.com/example")]
            [SoapRpcService]
            public class Exchange {
              [WebMethod]
              public double getRate(String country, String country2) {
                return 122.69;
              }
            }
          }

    Special thanks goes to the following people for providing the above description and details on
    .NET interoperability issues:

    Petr Janata <petr.janata AT i.cz>,

    Stefan Pharies <stefanph AT microsoft.com>,

    Brian Jepson <bjepson AT jepstone.net>, and others

TROUBLESHOOTING
    SOAP::Lite serializes "18373" as an integer, but I want it to be a string!
        SOAP::Lite guesses datatypes from the content provided, using a set of common-sense rules.
        These rules are not 100% reliable, though they fit for most data.

        You may force the type by passing a SOAP::Data object with a type specified:

         my $proxy = SOAP::Lite->proxy('http://www.example.org/soapservice');
         my $som = $proxy->myMethod(
             SOAP::Data->name('foo')->value(12345)->type('string')
         );

        You may also change the precedence of the type-guessing rules. Note that this means fiddling
        with SOAP::Lite's internals - this may not work as expected in future versions.

        The example above forces everything to be encoded as string (this is because the string test
        is normally last and always returns true):

          my @list = qw(-1 45 foo bar 3838);
          my $proxy = SOAP::Lite->uri($uri)->proxy($proxyUrl);
          my $lookup = $proxy->serializer->typelookup;
          $lookup->{string}->[0] = 0;
          $proxy->serializer->typelookup($lookup);
          $proxy->myMethod(\@list);

        See SOAP::Serializer for more details.

    "+autodispatch" doesn't work in Perl 5.8
        There is a bug in Perl 5.8's "UNIVERSAL::AUTOLOAD" functionality that prevents the
        "+autodispatch" functionality from working properly. The workaround is to use
        "dispatch_from" instead. Where you might normally do something like this:

           use Some::Module;
           use SOAP::Lite +autodispatch =>
               uri => 'urn:Foo'
               proxy => 'http://...';

        You would do something like this:

           use SOAP::Lite dispatch_from(Some::Module) =>
               uri => 'urn:Foo'
               proxy => 'http://...';

    Problems using SOAP::Lite's COM Interface

        Can't call method "server" on undefined value
            You probably did not register Lite.dll using "regsvr32 Lite.dll"

        Failed to load PerlCtrl Runtime
            It is likely that you have install Perl in two different locations and the location of
            ActiveState's Perl is not the first instance of Perl specified in your PATH. To rectify,
            rename the directory in which the non-ActiveState Perl is installed, or be sure the path
            to ActiveState's Perl is specified prior to any other instance of Perl in your PATH.

    Dynamic libraries are not found
        If you are using the Apache web server, and you are seeing something like the following in
        your webserver log file:

          Can't load '/usr/local/lib/perl5/site_perl/.../XML/Parser/Expat/Expat.so'
            for module XML::Parser::Expat: dynamic linker: /usr/local/bin/perl:
            libexpat.so.0 is NEEDED, but object does not exist at
            /usr/local/lib/perl5/.../DynaLoader.pm line 200.

        Then try placing the following into your httpd.conf file and see if it fixes your problem.

         <IfModule mod_env.c>
             PassEnv LD_LIBRARY_PATH
         </IfModule>

    SOAP client reports "500 unexpected EOF before status line seen
        See "Apache is crashing with segfaults"

    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 AT bigpond.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 AT 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 AT 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/>)

AVAILABILITY
    You can download the latest version SOAP::Lite for Unix or SOAP::Lite for Win32 from the
    following sources:

     * CPAN:                http://search.cpan.org/search?dist=SOAP-Lite

    You are welcome to send e-mail to the maintainers of SOAP::Lite with your comments, suggestions,
    bug reports and complaints.

ACKNOWLEDGEMENTS
    Special thanks to Randy J. Ray, author of *Programming Web Services with Perl*, who has
    contributed greatly to the documentation effort of SOAP::Lite.

    Special thanks to O'Reilly publishing which has graciously allowed SOAP::Lite to republish and
    redistribute the SOAP::Lite reference manual found in Appendix B of *Programming Web Services
    with Perl*.

    And special gratitude to all the developers who have contributed patches, ideas, time, energy,
    and help in a million different forms to the development of this software.

HACKING
    Latest development takes place on GitHub.com. Come on by and fork it.

    git AT github.com:redhotpenguin/perl-soaplite.git

    Also see the HACKING file.

    Actively recruiting maintainers for this module. Come and get it on!

REPORTING BUGS
    Please use rt.cpan.org or github to report bugs. Pull requests are preferred.

COPYRIGHT
    Copyright (C) 2000-2007 Paul Kulchenko. All rights reserved.

    Copyright (C) 2007-2008 Martin Kutter

    Copyright (C) 2013 Fred Moyer

LICENSE
    This library is free software; you can redistribute it and/or modify it under the same terms as
    Perl itself.

    This text and all associated documentation for this library is made available under the Creative
    Commons Attribution-NoDerivs 2.0 license. http://creativecommons.org/licenses/by-nd/2.0/

AUTHORS
    Paul Kulchenko (paulclinger AT yahoo.com)

    Randy J. Ray (rjray AT blackperl.com)

    Byrne Reese (byrne AT majordojo.com)

    Martin Kutter (martin.kutter AT fen-net.de)

    Fred Moyer (fred AT redhotpenguin.com)

SOAP::Lite(3pm)
NAME DESCRIPTION PERL VERSION WARNING OVERVIEW OF CLASSES AND PACKAGES METHODS
new(optional key/value pairs) transport(optional transport object) serializer(optional serializer object) packager(optional packager object) proxy(endpoint, optional extra arguments) endpoint(optional new endpoint address) service(service URL) outputxml(boolean) autotype(boolean) readable(boolean) headerattr(hash reference of attributes) bodyattr(hash reference of attributes) default_ns($uri) ns($uri,$prefix=undef) use_prefix(boolean) soapversion(optional value) envprefix(QName) encprefix(QName) encoding(encoding URN) uri(service specifier) multirefinplace(boolean) parts( ARRAY ) call(arguments) on_action(callback) on_fault(callback) on_nonserialized(callback) on_debug(callback)
WRITING A SOAP CLIENT
Example implementations Differences between the implementations
WRITING A SOAP SERVER FEATURES SECURITY INTEROPERABILITY TROUBLESHOOTING PERFORMANCE BUGS AND LIMITATIONS PLATFORM SPECIFICS RELATED MODULES
Transport Modules
AVAILABILITY ACKNOWLEDGEMENTS HACKING REPORTING BUGS COPYRIGHT LICENSE AUTHORS

Generated by phpman v3.7.12 Author: Che Dong Under GNU General Public License
2026-06-13 14:46 @216.73.216.28
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Valid XHTML 1.0 TransitionalValid CSS!

^_back to top