import SOAP-WSDL 2.00.07 from CPAN

git-cpan-module:   SOAP-WSDL
git-cpan-version:  2.00.07
git-cpan-authorid: MKUTTER
git-cpan-file:     authors/id/M/MK/MKUTTER/SOAP-WSDL-2.00.07.tar.gz
This commit is contained in:
Martin Kutter
2009-12-12 19:48:57 -08:00
committed by Michael G. Schwern
parent 3de318be40
commit bfc3247583
229 changed files with 16685 additions and 2064 deletions
+91
View File
@@ -0,0 +1,91 @@
=pod
=head1 Writing Code-First Web Services with SOAP::WSDL
B<Note: This document is just a collection of thought. There's no implementation yet>.
=head2 How Data Class definitions could look like
=head3 Moose
Of course SOAP::WSDL could (and probably should) just use Moose - it provides the full
Metaclass Framework needed for generating Schemas from class definitions.
However, Moose is way too powerful for building (just) simple Data Transfer Objects which
can be expressed in XML.
With Moose, a class could look like this:
package MyElements::GenerateBarCode;
use Moose;
has 'xmlns' =>
is => 'ro',
default => 'http://webservicex.net';
has 'xmlname' =>
is => 'ro',
default => 'GenerateBarCode';
has 'BarCodeParam' =>
is => 'rw',
type => 'MyTypes::BarCodeData';
has 'BarCodeText' =>
is => 'rw',
type => 'String';
1;
This is - despite the condensed syntax - a lot of line noise.
=head3 Native SOAP::WSDL
SOAP::WSDL::XSD::Typelib::ComplexType (should) provide a simple setup method allowing a even shorter
description (and offering the additional performance boost SOAP::WSDL has over Moose):
package MyElements::GenerateBarCode;
use strice; use warnings;
use SOAP::WSDL::XSD::Typelib::Element;
use SOAP::WSDL::XSD::Typelib::ComplexType;
_namespace 'http://webservicex.net'; # might be better in the SOAP server interface
_name 'GenerateBarCode';
_elements
BarCodeParam => 'MyTypes::BarCodeData',
BarCodeText => 'string';
This would result in the following XML Schema (inside a schema with the namespace
"http://webservicex.net" - the namespaces could even be declared outside the DTO classes.
<complexType name="GenerateBarCode">
<sequence>
<element name="BarCodeParam" type="tns:BarCodeData"/>
<element name="BarCodeText" type="xsd:string"/>
</sequence>
</complexType>
=head2 Interface definitions
Perl does not have the concept of interfaces. However, Moose provides Roles, which can be used for defining
interfaces.
However, it's not really necessary to define a interface Interface (in the sense of a Jave interface) -
a interface class is sufficient.
Subroutine attributes could be used for providing additional information - attributes in perl are much like
annotations in Java
A interface could look like this:
package MyServer::BarCode;
use strict; use warnings;
use SOAP::WSDL::Server::CodeFirst;
sub generateBarCode :WebMethod(name=<GenerateBarCode>
return=<MyElements::GenerateBarcodeResponse>
body=<MyElements::GenerateBarcode>) {
my ($self, $body, $header) = @_;
my $result = MyElements::GenerateBarcodeResponse->new();
return $result;
};
1;
+74 -4
View File
@@ -12,7 +12,7 @@ You need Crypt::SSLeay installed to access HTTPS webservices.
Passing a username and password, or a client certificate and key, to the
transport layer is highly dependent on the transport backend. The descriptions
below are for HTTP(S) transport usingLWP::UserAgent
below are for HTTP(S) transport using LWP::UserAgent
=head3 Accessing HTTP(S) webservices with basic/digest authentication
@@ -121,12 +121,82 @@ or nil elements):
return "<$prefix:$name>";
}
=head1 Skipping unknown XML elements - "lax" XML processing
SOAP::WSDL's default serializer
L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD> is a "strict"
XML processor in the sense that it throws an exception on encountering unknown
XML elements.
L<SOAP::WSDL::Deserializer::XSD|SOAP::WSDL::Deserializer::XSD> allows
switching off the stric XML processing by passing the C<strict =E<gt> 0>
option.
=head2 Disabling strict XML processing in a Client
Pass the following as C<deserializer_args>:
{ strict => 0 }
Example: The generated SOAP client is assumed to be "MyInterface::Test".
use MyInterface::Test;
my $soap = MyInterface::Test->new({
deserializer_args => { strict => 0 }
});
my $result = $soap->SomeMethod();
=head2 Disabling strict XML processing in a CGI based server
You have to set the deserializer in the transport class explicitely to
a L<SOAP::WSDL::Deserializer|SOAP::WSDL::Deserializer> object with the
C<strict> option set to 0.
Example: The generated SOAP server is assumed to be "MyServer::Test".
use strict;
use MyServer::Test;
use SOAP::WSDL::Deserializer::XSD;
my $soap = MyServer::Test->new({
transport_class => 'SOAP::WSDL::Server::CGI',
dispatch_to => 'main',
});
$soap->get_transport()->set_deserializer(
SOAP::WSDL::Deserializer::XSD->new({ strict => 0 })
);
$soap->handle();
=head2 Disabling strict XML processing in a mod_perl based server
Sorry, this is not implemented yet - you'll have to write your own handler
class based on L<SOAP::WSDL::Server::Mod_Perl2|SOAP::WSDL::Server::Mod_Perl2>.
=head1 Changing the encoding of a SOAP request
SOAP::WSDL uses utf-8 per default: utf-8
is the de-facto standard for webservice ommunication.
However, you can change the encoding the transport layer announces by calling
C<set_encoding($encoding)> on a client object.
You probably have to write your own serializer class too, because the default
serializer has the utf-8 encoding hardcoded in the envelope.
Just look into SOAP::WSDL::Serializer on how to do that.
Don't forget to register your serializer at the serializer factory
SOAP::WSDL::Factory::Serializer.
=head1 LICENSE AND COPYRIGHT
Copyright 2008 Martin Kutter.
Copyright 2008, 2009 Martin Kutter.
This library is free software. You may distribute/modify it under
the same terms as perl itself
This file is part of SOAP-WSDL. You may distribute/modify it under
the same terms as perl itself.
=head1 AUTHOR