为特定SOAP请求创建WSDL
我必须基于WSDL文件创建特定的SOAP请求消息。我正在使用soapui从WSDL创建SOAP请求 SOAP请求应如下所示:为特定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
<?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>