CUFP
ruoso
<P>This post is mostly an update of the features of the Catalyst::Controller::SOAP module, but since this is a groundbreaking release and that you now can deploy easily WSDL oriented services, I thought it is worth a post here.</P>
<H3>Usage</H3>
<H4>RPC/Literal</H4>
<P>RPC Literal is an alternative to RPC/Encoded, as many people don't like SOAP-Encoding. You still have the RPC semantics and the input and output are parsed according to the WSDL</P>
<readmore>
<code>
package MyApp::Controller::Service;
use strict;
use warnings;
use base qw(Catalyst::Controller::SOAP::RPC);
__PACKAGE__->config->{wsdl} = 'foo.wsdl';
sub operation : SOAP(RPCLiteral) {
my ($self, $c, $in) = @_;
# where $in is a hashref with the result of the
# XML::Compile::Schema
# parse for the type of each of the message parts,
# the key is the name of the part, the value is the
# result of the parse.
...
# to return a value, you can also use XML::Compile
# features, according to the WSDL types.
$c->stash->{soap}->compile_return({ ... });
}
</code>
</readmore>
<h4>Document/Literal</H4>
<P>Also known as Document/Literal-Bare, this is a usage where each endpoint has only one operation. This way, your operation look like</P>
<readmore>
<code>
sub other_operation : Local SOAP('DocumentLiteral') {
# the body is parsed the same way as RPC literal,
# except that RPC Literal starts the parsing inside
# the operation element, while Document Literal parses
# the whole body.
# The return can be set in the exact same way.
}
</code>
</readmore>
<h4>Document/Literal Wrapped</H4>
<P><B>THIS IS IMPLEMENTED FOR COMPATIBILITY REASONS ONLY</B>, and provides an endpoint that delays the dispatch based on the SOAPAction header. Please see Catalyst::Controller::SOAP::DocumentLiteralWrapped documentation for a detailed explanation of why this usage <B>SUCKS</B></P>
<readmore>
<P>Here the programming semantics are the same of RPC/Literal, but the parsing semantics are the same of Document/Literal.</P>
<code>
package MyApp::Controller::Service;
use strict;
use warnings;
use base qw(Catalyst::Controller::SOAP::DocumentLiteralWrapped);
__PACKAGE__->config->{wsdl} = 'foo.wsdl';
__PACKAGE__->config->{soap_action_prefix} = 'http://example.com/';
sub operation : SOAP('DocumentLiteral') {
# The final operation is still DocumentLiteral, but
# the superclass registers a dispatcher that will
# forward to this action based on the SOAPAction
# header.
}
</code>
<P><STRONG>BUT I, AGAIN, WARN YOU THAT THIS IS A PSEUDO-STANDARD DEFINED BY MICROSOFT THAT IS HTTP-SPECIFIC, AND SHOULD BE DISCOURAGED. RPC/Literal CAN IMPLEMENT THE EXACT SAME MESSAGES THAN Document/Literal-Wrapped AND KEEPS THE DISPATCHING SEMANTICS SANE.</STRONG></P>
</readmore>
<h3>And what about client use?</h3>
<P>Catalyst::Controller::SOAP have the companion Catalyst::Model::SOAP that maps stub methods for every operation as described by XML::Compile::WSDL11.</P>
<P>So, happy hacking...</P>
<div class="pmsig"><div class="pmsig-463883">
daniel
</div></div>