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:
committed by
Michael G. Schwern
parent
3de318be40
commit
bfc3247583
@@ -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;
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user