SOAP::Lite man page on OpenServer

Man page or keyword search:  
man Server   5388 pages
apropos Keyword Search (all sections)
Output format
OpenServer logo
[printable version]

SOAP::Lite(3)	      User Contributed Perl Documentation	 SOAP::Lite(3)

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.

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

	   SOAP::Transport - Supports transport architecture

	   SOAP::Data - Provides extensions for serialization architecture

	   SOAP::Header - Provides extensions for header serialization

	   SOAP::Parser - Parses XML file into object tree

	   SOAP::Serializer - Serializes data structures to SOAP package

	   SOAP::Deserializer - Deserializes results of SOAP::Parser into
	   objects

	   SOAP::SOM - Provides access to deserialized object tree

	   SOAP::Constants - Provides access to common constants

	   SOAP::Trace - Provides 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 trans-
	   port

       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
       The first group of methods presented are the constructor and the acces-
       sor methods. All accessor methods share the trait of returning the cur-
       rent appropriate value when called with no arguments, while returning
       the object reference itself when called with a new value for the field
       in question. This allows the set-attribute calls to be chained
       together.

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

	   This is the constructor of the class. 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( );

	   Provides access to the transport object that the client has allo-
	   cated to manage the communication layer operations. You can set
	   this by passing a new object that derives from "SOAP::Transport",
	   but this is generally not needed or recommended. Several of the
	   following methods are shortcuts to this object's accessors.

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

	   Provides access to the "SOAP::Serializer" object that the client
	   uses to transform the elements and data of a request into an XML
	   document for the sake of transport. As with transport, this may be
	   set by providing a new object reference, but it is generally not
	   needed.

       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. It shouldn't be confused with the uri method discussed
	   later, which refers to a different element of the conversation.
	   This method allows the setting of the endpoint, along with any
	   extra information that the transport object may need when communi-
	   cating the request. Indeed, this method is actually an alias to the
	   proxy method of SOAP::Transport. It is the same as typing:

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

	   When extra information is needed, it is also passed in the call to
	   this method. Connecting to a server that uses browser cookies for
	   authentication can be done by creating an instance of the
	   HTTP::Cookies class (from the LWP package) and passing it as the
	   value following a key of cookie_jar. The value for sockettime-outs
	   may also be set this way. The full range of options vary by trans-
	   port method. One common theme is that the endpoint string is always
	   the first argument, with all additional arguments following it.

	   The following is a list of optional arguments that may be passed to
	   "proxy()":

	   options( HASH )
	       This is for SOAP::Lite specific options. Currently the only
	       option one is allowed to set is the "compress_threshold"
	       option. See COMPRESSION in HTTP::Transport.

	   All initialization options from LWP::UserAgent

	   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 trans-
	   port code. Note that the proxy method must have already 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');

	   Controls whether the returned information from a remote method call
	   is the raw XML from the server. The default is to process the data
	   from the server and present it to the caller as an object of the
	   SOAP::SOM class. If the application prefers to use a different
	   parser or do something else entirely with the results, this method
	   may be used to inhibit the parsing of the returned information.

       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 gener-
	   ated 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 addi-
	   tional characters.

       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 so:

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

       ns($uri,$prefix=undef)
	   Sets the namespace uri and optionally the namespace prefix for the
	   request to the specified values. This overrides any previous names-
	   pace 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 ele-
	   ments to be serialized with a declared namespace prefix, like so:

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

       use_prefix(boolean)
	   Deprecated - the "use_prefix()" subroutine has been deprecated in
	   order to provide a more intuitive naming scheme for subroutines
	   that set namespaces. "use_prefix()" was originally added to allow
	   users to turn on or off the use of a default namespace. This func-
	   tionality is being replaced by "ns()" and "default_ns()".

	   Shortcut for "serializer->use_prefix()". This lets you turn on/off
	   the use of a namespace prefix for the children of the /Enve-
	   lope/Body element. Default is 'true'. (This was introduced in 0.61
	   for better .NET compatibility)

	   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 'true', serialized XML will look like
	   this:

	     <SOAP-ENV:Envelope ...attributes skipped>
	       <SOAP-ENV:Body>
		 <mymethod xmlns="urn:MyURI" />
	       </SOAP-ENV:Body>
	     </SOAP-ENV:Envelope>

       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 parame-
	   ter 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);

	   The namespace label used for the main SOAP namespace elements (such
	   as Envelope, Body, and the attributes) defaults to SOAP-ENV. As has
	   been discussed in earlier chapters, the label itself isn't impor-
	   tant. But applications that wish to explicitly choose a different
	   one (such as env to denote a SOAP 1.2 message) may do so with this
	   method.

       encprefix(QName)
	       $client->encprefix('enc');

	   This method is a shortcut for:

	       $client->serializer->encprefix(QName);

	   As with the envprefix method, this gets or sets the label used for
	   the namespace of the encoding rules. The default value is SOAP-ENC,
	   as is generally used in SOAP 1.1 messages, though the label itself
	   has no actual meaning.

       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 actu-
	   ally 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 has been 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 in lieu 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 confus-
	   ing, this method doesn't specify the endpoint itself. In most cir-
	   cumstances, 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 ref-
	   erences 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  lifecy-
       cle. 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.

       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 dia-
	   log with the text of fault extracted from the object (which is cov-
	   ered 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 con-
	   trol over signaling that error.

       on_debug(callback)
	       $client->on_debug(sub { print @_ });

	   This is kept for backwards-compatibility with earlier versions of
	   the toolkit. Each method has a trace step built in, which is called
	   at routine entry. This specifies a callback to be used when these
	   trace statements are reached. Because this is deprecated, it is
	   recommended that applications use the +debug and +trace facilities
	   described later under SOAP::Trace. Note also that debugging isn't
	   handled on a per-object basis; if this method is used on a given
	   object, it sets debugging behavior for all objects of the class.

WRITING A SOAP CLIENT
       TODO - soap client example

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

FEATURES
       ATTACHMENTS

       "SOAP::Lite" features support for the SOAP with Attachments specifica-
       tion.  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
       trasmitted 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 han-
       dlers 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 unex-
       pected 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 from
       "result()" and "undef" from "paramsout()".

       Results can be arbitrary complex: they can be an array, 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.	 Auto-
       binding gives it to you. That will work with objects also with one dif-
       ference: 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", "MOD-
       ULE::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.

       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 "dis-
       patch_to()" and "dispatch_with()" methods in the same server, but note
       that "dispatch_with()" has a higher order of precedence. "dis-
       patch_to()" will be checked only after "URI" and "SOAPAction" has been
       checked. See t/03-server.t for more information and examples.

       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 exisiting 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 pack-
       age 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 exam-
	   ple,

	      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 incoding 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 fol-
       lowing recommendations:

       Declare a proper soapAction in your call
	   For example, use "on_action( sub { 'http://www.myuri.com/WebSer-
	   vice.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 them-
	   selves. 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 pallatable 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]
	       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@i.cz>,

       Stefan Pharies <stefanph@microsoft.com>,

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

TROUBLESHOOTING
       SOAP::Lite serializes "18373" as an integer, but I want it to be a
       string!
	   Because Perl is loosely typed, there is no 100% reliable way to
	   predict what the *intended* type of a variable is. So SOAP::Lite
	   has a system of guessing what a type is. But it is not 100% reli-
	   able. You do however, have the control to override this autotyping
	   behavior with your own.

	   Suppose you wanted to case every element of an array as a string.
	   Then the following code will change the precedence of SOAP::Seri-
	   ailizer's is-a-string test to be the first test run. Because the
	   is-a-string test always returns "true" every element will be deter-
	   mined to be a string.

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

	   Alternatively, you can build the XML data structure manually...

	   See SOAP::Serializer.

       "+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 prop-
	   erly. 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 loca-
	       tions 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 some-
	   thing 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@bigpond.net.au> for
	   explaining this weird behavior.

	   If this doesn't address the problem, you may wish to try "-Uusemy-
	   malloc", 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 signif-
	   icant.

	   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 por-
	   tion of processed stream, but individually for every processed
	   entity or newline. It can lead to lot of calls and additional mem-
	   ory manager expenses even for small messages. By contrast, XML mes-
	   sages 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 mes-
	   sage you already got (and you cannot control content of this mes-
	   sage), however, if your are in charge for both ends of processing
	   you can switch encoding to base64 on sender's side. It will defi-
	   nitely work with SOAP::Lite and it may work with other tool-
	   kits/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::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
       o   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).

       o   Limited support for WSDL schema.

       o   XML::Parser::Lite relies on Unicode support in Perl and doesn't do
	   entity decoding.

       o   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/ASAND-
	   STRM/XML-Parser-2.27-bin-1-MacOS.tgz

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

	* SOAP::Lite Homepage: http://soaplite.com/
	* CPAN:		       http://search.cpan.org/search?dist=SOAP-Lite
	* Sourceforge:	       http://sourceforge.net/projects/soaplite/

       You are welcome to send e-mail to the maintainers of SOAP::Lite with
       your 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 man-
       ual 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.

REPORTING BUGS
       Please report all suspected SOAP::Lite bugs using Sourceforge. This
       ensures proper tracking of the issue and allows you the reporter to
       know when something gets fixed.

       http://sourceforge.net/tracker/?group_id=66000&atid=513017

       If under dire circumstances you need immediate assistance with the res-
       olution of an issue, you are welcome to contact Byrne Reese at <byrne
       at majordojo dot com>.

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

       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@yahoo.com)

       Randy J. Ray (rjray@blackperl.com)

       Byrne Reese (byrne@majordojo.com)

perl v5.8.8			  2006-08-16			 SOAP::Lite(3)
[top]
                             _         _         _ 
                            | |       | |       | |     
                            | |       | |       | |     
                         __ | | __ __ | | __ __ | | __  
                         \ \| |/ / \ \| |/ / \ \| |/ /  
                          \ \ / /   \ \ / /   \ \ / /   
                           \   /     \   /     \   /    
                            \_/       \_/       \_/ 
More information is available in HTML format for server OpenServer

List of man pages available for OpenServer

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net