O
Oliver M. Bolzer
Hi!
I'm currently building a simple request-response style webservice using
SOAP4R and describing it in WSDL, so that it can easily be used from multiple
langages.
I was wondering how best I should describe the exceptions my methods will be
raising. First, I defined two compexType's that look like what SOAP4R actually
throws.
<wsdl:types>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://fakeroot.net/webservice/rbg/ver1/">
<complexType name="AuthenticationError">
<all>
<element name="message" type="xsd:string" />
<element name="backtrace" type="xoapenc:Array" />
</all>
</complexType>
<complexType name="AuthorizationError">
<all>
<element name="message" type="xsd:string" />
<element name="backtrace" type="xoapenc:Array" />
</all>
</complexType>
</xsd:schema>
</wsdl:types>
and then, defined each of them as a message.
<wsdl:message name="authentication_ERROR" >
<wsdlart name="exception" type="tns:AuthenticationError" />
</wsdl:message>
<wsdl:message name="authorization_ERROR" >
<wsdlart name="exception" type="tns:AuthorizationError" />
</wsdl:message>
Finally I bound the two messages to my operation with the <fault/> element
<wsdlortType name="FooService">
<wsdlperation name="dosomething">
<wsdl:input message="tns:dosomething_IN" />
<wsdlutput message="tns:dosomething_OUT" />
<wsdl:fault message="tns:authentication_ERROR" />
<wsdl:fault message="tns:authorization_ERROR" />
</wsdlperation>
</wsdlortType>
The AuthenticationError and AuthorizationError classdefs are generated according
to the type-definition (naturally, similart to Ruby's Exception class) but
using the XML-code above, only AuthorizationError inherits from StandardError,
AuthenticationError doesn't. If I swap the two <fault> tags above, only
AuthorizationError inherits but AuthenticationError doesn't.
Looking at SOAP4R 1.5.0's wsdl/operation.rb, it seems that it only supports
one fault per operation, overriding earlier <fault>s with later occuring ones
in WSDL::Operation#parse_element().
But the WSDL 1.1 schema states that an <operation> can have multiple <faults>.
...
<element name="operation" type="wsdlperationType"/>
<complexType name="operationType">
....
<element ref="wsdl:fault" minOccurs="0" maxOccurs="unbounded"/>
....
</complexType>
A bug in SOAP4R 1.5.0 ? Or I might be misunderstanding something.
Or is there any recommended/proper way to declare the exceptions that
my SOAP4R-service will raise in WSDL, in a langage-independent way ?
I'm currently building a simple request-response style webservice using
SOAP4R and describing it in WSDL, so that it can easily be used from multiple
langages.
I was wondering how best I should describe the exceptions my methods will be
raising. First, I defined two compexType's that look like what SOAP4R actually
throws.
<wsdl:types>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://fakeroot.net/webservice/rbg/ver1/">
<complexType name="AuthenticationError">
<all>
<element name="message" type="xsd:string" />
<element name="backtrace" type="xoapenc:Array" />
</all>
</complexType>
<complexType name="AuthorizationError">
<all>
<element name="message" type="xsd:string" />
<element name="backtrace" type="xoapenc:Array" />
</all>
</complexType>
</xsd:schema>
</wsdl:types>
and then, defined each of them as a message.
<wsdl:message name="authentication_ERROR" >
<wsdlart name="exception" type="tns:AuthenticationError" />
</wsdl:message>
<wsdl:message name="authorization_ERROR" >
<wsdlart name="exception" type="tns:AuthorizationError" />
</wsdl:message>
Finally I bound the two messages to my operation with the <fault/> element
<wsdlortType name="FooService">
<wsdlperation name="dosomething">
<wsdl:input message="tns:dosomething_IN" />
<wsdlutput message="tns:dosomething_OUT" />
<wsdl:fault message="tns:authentication_ERROR" />
<wsdl:fault message="tns:authorization_ERROR" />
</wsdlperation>
</wsdlortType>
The AuthenticationError and AuthorizationError classdefs are generated according
to the type-definition (naturally, similart to Ruby's Exception class) but
using the XML-code above, only AuthorizationError inherits from StandardError,
AuthenticationError doesn't. If I swap the two <fault> tags above, only
AuthorizationError inherits but AuthenticationError doesn't.
Looking at SOAP4R 1.5.0's wsdl/operation.rb, it seems that it only supports
one fault per operation, overriding earlier <fault>s with later occuring ones
in WSDL::Operation#parse_element().
But the WSDL 1.1 schema states that an <operation> can have multiple <faults>.
...
<element name="operation" type="wsdlperationType"/>
<complexType name="operationType">
....
<element ref="wsdl:fault" minOccurs="0" maxOccurs="unbounded"/>
....
</complexType>
A bug in SOAP4R 1.5.0 ? Or I might be misunderstanding something.
Or is there any recommended/proper way to declare the exceptions that
my SOAP4R-service will raise in WSDL, in a langage-independent way ?