from ruby-talk
When using the SOAP::WSDLDriverFactory to talk to webservices the form tag
of some elements is not honored. If you look at the wsdl below you will
see that the schemas 'elementFormDefault="qualified"' but the complexType
sequence elements have a 'form="unqualified"' tag. The generated soap
request is not correct. It adds the namespace for the sequence elements of
the complexType anyway. This also happens with the classes generated using
the WSDL2Ruby class to generate classdef's. I was able to get around it by
generating a driver with WSDL2Ruby and setting the flag on the in
parameters to false and then modifying the classdef generated file for the
complexType to have nil namespaces in the @@schema_element. Also it seems
wrong for the response that I do not have to set the flag on the out
parameters of the generated driver class to false or change the
@@schema_element in the classdef generated file and it still properly
handlers the response xml that does not have the namespace on its complex
type sequence elements.
GENERATED REQUEST:
<?xml version="1.0" encoding="us-ascii" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<n1:TestTransaction xmlns:n1="http://TEST/TestTransaction">
<n1:Request>
<n1:FirstName>testfirst</n1:FirstName>
<n1:LastName>testlast</n1:LastName>
<n1:Street>teststreet</n1:Street>
<n1:City>testcity</n1:City>
<n1:State>teststate</n1:State>
<n1:Zip>testzip</n1:Zip>
</n1:Request>
</n1:TestTransaction>
</env:Body>
</env:Envelope>
PROPER REQUEST (What it should look like):
<?xml version="1.0" encoding="us-ascii" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<n1:TestTransaction xmlns:n1="http://TEST/TestTransaction">
<n1:Request>
<FirstName>testfirst</FirstName>
<LastName>testlast</LastName>
<Street>teststreet</Street>
<City>testcity</City>
<State>teststate</State>
<Zip>testzip</Zip>
</n1:Request>
</n1:TestTransaction>
</env:Body>
</env:Envelope>
WSDL:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://TEST/TestTransaction" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://TEST/TestTransaction" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://TEST/TestTransaction">
<s:element name="TestTransaction">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Request" type="tns:TransactionRequest" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="TransactionRequest">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="FirstName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="LastName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Street" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="City" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="State" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Zip" type="s:string" />
</s:sequence>
</s:complexType>
<s:element name="TestTransactionResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:TransactionResponse" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="TransactionResponse">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionStatus" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionID" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Message" type="s:string" />
</s:sequence>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:message name="TestTransactionSoapIn">
<wsdl:part name="parameters" element="tns:TestTransaction" />
</wsdl:message>
<wsdl:message name="TestTransactionSoapOut">
<wsdl:part name="parameters" element="tns:TestTransactionResponse" />
</wsdl:message>
<wsdl:portType name="PerformTestTransactionSoap">
<wsdl:operation name="TestTransaction">
<wsdl:input message="tns:TestTransactionSoapIn" />
<wsdl:output message="tns:TestTransactionSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PerformTestTransactionSoap" type="tns:PerformTestTransactionSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
<wsdl:operation name="TestTransaction">
<soap:operation soapAction="http://TEST/TestTransaction/TestTransaction" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PerformTestTransaction">
<wsdl:port name="PerformTestTransactionSoap" binding="tns:PerformTestTransactionSoap">
<soap:address location="http://localhost:3000/testwebservice/action" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>