【问题标题】:How to have a wsdl conform to the soap input如何让wsdl符合soap输入
【发布时间】:2020-02-18 07:56:45
【问题描述】:

我们正在将我们的肥皂网络服务从 jetty 更改为 jaxws。目标是保持相同的输入消息。我已经使用原始的 WSDL 来使用 netbeans 创建服务。 WSDL 如下:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://www.mycompany.nl/DcxExpeditieService/v1"
        xmlns:tns="http://www.mycompany.nl/DcxExpeditieService/v1"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:types>
        <xs:schema targetNamespace="http://www.mycompany.nl/DcxExpeditieService/v1"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
            <xs:element name="DcxExpeditie" type="tns:DcxExpeditie"/>
            <xs:complexType name="DcxExpeditie">
                <xs:sequence>
                    <xs:element name="Expeditie" type="tns:Expeditie"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="Expeditie">
                <xs:sequence>
                    <xs:element name="tag1" type="xs:string"/>
                    <xs:element name="tag2" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="DcxExpeditieRequest">
        <wsdl:part name="DcxExpeditie" type="tns:DcxExpeditie"/>
    </wsdl:message>
    <wsdl:message name="DcxExpeditieResponse">
        <wsdl:part name="DcxExpeditieResponse" type="xs:string"/>
    </wsdl:message>
    <wsdl:portType name="DcxExpeditieServicePortType">
        <wsdl:operation name="DcxExpeditieOperation">
            <wsdl:input message="tns:DcxExpeditieRequest"/>
            <wsdl:output message="tns:DcxExpeditieResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="DcxExpeditieServiceSOAP" type="tns:DcxExpeditieServicePortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="DcxExpeditieOperation">
            <soap:operation soapAction="http://www.mycompany.nl/DcxExpeditieService/v1/DcxExpeditie"/>
            <wsdl:input>
                <soap:body use="literal" namespace="http://www.mycompany.nl/DcxExpeditieService/v1"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" namespace="http://www.mycompany.nl/DcxExpeditieService/v1"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="DcxExpeditieService">
        <wsdl:port name="DcxExpeditieServiceSOAP" binding="tns:DcxExpeditieServiceSOAP">
            <soap:address location="https://someserver.mycompany.nl/vbs/dcxexpeditie"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

在 soapui 中使用此 WSDL 时,会产生以下输入示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.mycompany.nl/DcxExpeditieService/v1">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:DcxExpeditieOperation>
         <DcxExpeditie>
            <v1:Expeditie>
               <v1:tag1>?</v1:tag1>
               <v1:tag2>?</v1:tag2>
            </v1:Expeditie>
         </DcxExpeditie>
      </v1:DcxExpeditieOperation>
   </soapenv:Body>
</soapenv:Envelope>

但是,原来的输入格式是:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://www.mycompany.nl/DcxExpeditieService/v1">
       <soapenv:Header/>
       <soapenv:Body>
          <v1:DcxExpeditie>
                <v1:Expeditie>
                   <v1:tag1>?</v1:tag1>
                   <v1:tag2>?</v1:tag2>
                </v1:Expeditie>
          </v1:DcxExpeditie>
       </soapenv:Body>
    </soapenv:Envelope>

所以没有DcxExpeditieOperation标签并且DcxExpeditie前面有v1命名空间

这可能吗?如果可以,我该怎么做?

【问题讨论】:

    标签: soap wsdl jax-ws


    【解决方案1】:

    尝试将 SOAP 绑定从 rpc 更改为文档以删除 DcxExpeditieOperation 标记:

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    

    要修复命名空间问题,请参阅类型为 Dcx​​Expeditie 的元素:

    <wsdl:part name="DcxExpeditie" element="tns:DcxExpeditie"/>
    

    更新的 WSDL 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://www.mycompany.nl/DcxExpeditieService/v1"
                      xmlns:tns="http://www.mycompany.nl/DcxExpeditieService/v1"
                      xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
            <xs:schema targetNamespace="http://www.mycompany.nl/DcxExpeditieService/v1"
                               xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
                <xs:element name="DcxExpeditie" type="tns:DcxExpeditie"/>
                <xs:element name="DcxExpeditieResponse" type="xs:string"/>
                <xs:complexType name="DcxExpeditie">
                    <xs:sequence>
                        <xs:element name="Expeditie" type="tns:Expeditie"/>
                    </xs:sequence>
                </xs:complexType>
                <xs:complexType name="Expeditie">
                    <xs:sequence>
                        <xs:element name="tag1" type="xs:string"/>
                        <xs:element name="tag2" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:schema>
        </wsdl:types>
        <wsdl:message name="DcxExpeditieRequest">
            <wsdl:part name="DcxExpeditie" element="tns:DcxExpeditie"/>
        </wsdl:message>
        <wsdl:message name="DcxExpeditieResponse">
            <wsdl:part name="DcxExpeditieResponse" element="tns:DcxExpeditieResponse" />
        </wsdl:message>
        <wsdl:portType name="DcxExpeditieServicePortType">
            <wsdl:operation name="DcxExpeditieOperation">
                <wsdl:input message="tns:DcxExpeditieRequest"/>
                <wsdl:output message="tns:DcxExpeditieResponse"/>
            </wsdl:operation>
        </wsdl:portType>
        <wsdl:binding name="DcxExpeditieServiceSOAP" type="tns:DcxExpeditieServicePortType">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="DcxExpeditieOperation">
                <soap:operation soapAction="http://www.mycompany.nl/DcxExpeditieService/v1/DcxExpeditie"/>
                <wsdl:input>
                    <soap:body use="literal" />
                </wsdl:input>
                <wsdl:output>
                    <soap:body use="literal" />
                </wsdl:output>
            </wsdl:operation>
        </wsdl:binding>
        <wsdl:service name="DcxExpeditieService">
            <wsdl:port name="DcxExpeditieServiceSOAP" binding="tns:DcxExpeditieServiceSOAP">
                <soap:address location="https://someserver.mycompany.nl/vbs/dcxexpeditie"/>
            </wsdl:port>
        </wsdl:service>
    </wsdl:definitions>
    

    【讨论】:

    • 如果我将绑定更改为文档 netbeans 说:在指定的 WSDL 文件中没有服务
    • 我用 WSDL 文件做了一些修复并更新了答案。你能检查一下,是否会被导入?
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多