Either WSDL or wsimport and wsdl (mono) are horribly broken

前端 未结 2 1184
执念已碎
执念已碎 2021-01-06 11:40

EDIT I started off with the example given below, but I have now:

  • Tried the example from the W3C spec. After fixing another error (binding was
相关标签:
2条回答
  • 2021-01-06 12:19

    If I remember correctly, wsimport requires external namespaces to be imported in order to use elements of them in the WSDL file. In your case:

     <import namespace="http://example/schema/OrdersService"/>
    
    0 讨论(0)
  • 2021-01-06 12:28

    Although the question is rather old, here's a working WSDL:

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions name="OrdersService"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
      xmlns:os="http://example/schema/OrdersService"
      xmlns:tns="http://example/ns/OrdersService"
      targetNamespace="http://example/ns/OrdersService">
    
      <wsdl:types>
        <xsd:schema targetNamespace="http://example/schema/OrdersService">
    
          <xsd:element name="GetOrders">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="criteria" type="xsd:string" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
    
          <xsd:element name="GetOrdersResponse">
            <xsd:complexType>
              <xsd:all>
                <xsd:element name="orders" type="xsd:string" />
              </xsd:all>
            </xsd:complexType>
          </xsd:element>
    
        </xsd:schema>
      </wsdl:types>
    
      <wsdl:message name="GetOrdersRequest">
        <wsdl:part name="parameters" element="os:GetOrders" />
      </wsdl:message>
    
      <wsdl:message name="GetOrdersResponse">
        <wsdl:part name="parameters" element="os:GetOrdersResponse" />
      </wsdl:message>
    
      <wsdl:portType name="GetOrdersPortType">
        <wsdl:operation name="GetOrders">
          <wsdl:input message="tns:GetOrdersRequest" />
          <wsdl:output message="tns:GetOrdersResponse" />
        </wsdl:operation>
      </wsdl:portType>
    
      <wsdl:binding name="GetOrdersBinding" type="tns:GetOrdersPortType">
        <soap:binding style="document"
           transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="GetOrders">
          <soap:operation soapAction="" />
          <wsdl:input>
            <soap:body use="literal" />
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal" />
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
    
      <wsdl:service name="OrdersService">
        <wsdl:port name="GetOrdersPort" binding="tns:GetOrdersBinding">
          <soap:address
             location="http://localhost:8080/svc/OrdersService/GetOrders" />
        </wsdl:port>
      </wsdl:service>
    
    </wsdl:definitions>
    

    Things that I've changed:

    • set xmlns:xsd to http://www.w3.org/2001/XMLSchema instead of http://www.w3.org/1999/XMLSchema (the 1999 version is quite outdated)

    • removed namespace identified from the schema elements (GetOrders instead of o:GetOrders and GetOrdersResponse instead of os:GetOrdersResponse) (namespace qualifiers are not allowed within the name attribute of an element or type definition)

    • used the correct types for the subelements criteria and orders: xsd:string instead of string


    I agree, that a WSDL might be difficult in the beginning, however, once you have a grip on it, there's nothing better than a clearly defined interface. If I had a choice, I would prefer a wsdl over a json-REST-API without hesitation. But I guess that's a matter of taste ;-)

    0 讨论(0)
提交回复
热议问题