为特定SOAP请求创建WSDL

为特定SOAP请求创建WSDL,soap,xsd,wsdl,Soap,Xsd,Wsdl,我必须基于WSDL文件创建特定的SOAP请求消息。我正在使用soapui从WSDL创建SOAP请求 SOAP请求应如下所示: <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"> <S

我必须基于WSDL文件创建特定的SOAP请求消息。我正在使用soapui从WSDL创建SOAP请求

SOAP请求应如下所示:

<?xml version="1.0"?>
<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Header>
    <username>xxxx</username>
    <password>xxxx</password>
    <MaxOrders>1</MaxOrders>
    <xmlVers>1</xmlVers>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <m:getNewOrders xmlns:m= "urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/">
    </m:getNewOrders>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

xxxx
xxxx
1.
1.
我有以下WSDL:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions 
xmlns:m="https://xxx.yyy.co.uk/b2b/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
name="xxxOrders" 
targetNamespace="https://xxx.yyy.co.uk/b2b/">
 <wsdl:types>
<xsd:schema targetNamespace="https://xxx.yyy.co.uk/b2b/">
  <xsd:element name="Envelope">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Header"/>
        <xsd:element name="Body"/>
      </xsd:sequence>
      <xsd:attribute name="encodingstyle" type="xsd:anyURI" form="qualified" use="required" />
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="Header">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="username" type="xsd:NCName" form="unqualified" />
        <xsd:element name="password" type="xsd:integer" form="unqualified" />
        <xsd:element name="MaxOrders" type="xsd:integer" form="unqualified" />
        <xsd:element name="xmlVers" type="xsd:integer" form="unqualified" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="Body">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="m:getNewOrders" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="getNewOrders">
    <xsd:complexType />
  </xsd:element>
</xsd:schema>
  </wsdl:types>

  <wsdl:message name="getNewOrders">
    <wsdl:part element="m:getNewOrders" name="parameters"/>
  </wsdl:message>


  <wsdl:portType name="xxxOrders">
    <wsdl:operation name="getNewOrders">
      <wsdl:input message="m:getNewOrders"/>
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="xxxOrdersSOAP" type="m:xxxOrders">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getNewOrders">
      <soap:operation soapAction="urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="xxxOrders">
    <wsdl:port binding="m:xxxOrdersSOAP" name="xxxOrdersSOAP">
      <soap:address location="https://xxx.yyy.co.uk/b2b/soap/soap_orders.asp"/>
    </wsdl:port>
  </wsdl:service>
 </wsdl:definitions>

但是,当我获取该WSDL并将其导入SOAP UI时,SOAP请求消息看起来与我预期的不同:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:b2b="https://xxx.yyy.co.uk/b2b/">
   <soapenv:Header/>
   <soapenv:Body>
      <b2b:getNewOrders/>
   </soapenv:Body>
</soapenv:Envelope>

例如,我的
标题
元素为空。我认为
getNewOrders
可以,因为它绑定到
xmlns:b2b
,所以我不需要getNewOrders元素中的名称空间。我说得对吗


有人能指出我必须在WSDL中修复什么吗?我迷路了。

您可以使用名称空间,问题是您没有定义标题部分。现在,即使你这样做,我也不知道你的工具是否会考虑到。。。但毫无疑问,在接口定义方面,这是您必须做的

搜索“wsdl-soap头示例”或类似内容应该会产生很多点击,例如

重点是:

  • 输入部件应定义与标题相关的部件

  • 您需要将该头部分绑定到SOAP头


现在,我还没有检查前缀(您应该有一个与WSDL的targetNamespace匹配的默认名称空间,以便上面的工作不带前缀,等等),也没有尝试为您重写WSDL。。。但这基本上就是您指定标题的方式:您的输入有多个部分,在SOAP中,一个在标题中,另一个在正文中。

您是指
https://b2bqa.shoprite.co.za/b2b/
https://xxx.yyy.co.uk/b2b/
?@John:谢谢。是的,很抱歉-我编辑了它。谢谢你佩特罗·加德亚,它现在工作正常了。一件奇怪的事情是,如果我使用前缀“soapenv”或“SOAP-ENV”,显然对webservice服务器很重要。它只接受“SOAP-ENV”。但我会用XSLT解决这个问题。顺致敬意,Peter@Peter,这真的很奇怪。。。只要不同的前缀绑定到同一个名称空间(URI),那么前缀(别名)的选择对于任何有名称空间意识的XML解析器来说都不重要。如果服务关心使用哪个前缀,那么它就严重受损。您的公司应该避免与其他公司做生意,因为这些公司不愿意遵循简单的行业标准,这些标准已经实施了十多年。@John:谢谢您提供的有用建议。我一定会告诉他们。对我来说,另一个奇怪的事实是,他们想每30天更改一次密码。我认为这是不必要的,特别是因为证书也用于服务器身份验证。我必须连接到他们的Web服务是用Visual Basic编写的。向你问好,彼得
 <wsdl:message name="getNewOrders">
     <wsdl:part element="m:getNewOrders" name="parameters"/>
     <wsdl:part element="m:Header" name="header"/>
 </wsdl:message>
<wsdl:operation name="getNewOrders">
  <soap:operation soapAction="urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/"/>
 <wsdl:input name="getNewOrders">
   <wsdlsoap:header message="getNewOrders" part="header" use="literal"/>
   <wsdlsoap:body use="literal" parts="parameters"/>
 </wsdl:input>
  <wsdl:output>
    <soap:body use="literal"/>
  </wsdl:output>
</wsdl:operation>