假设我的WSDL包含以下内容:
<message name="modifRequest">
<part name="siList" element="sn:siListElement"/>
</message>
<message name="modifResponse">
<part name="siList" element="sn:boolElement"/>
</message>
<portType name="siModificationPortType">
<operation name="delete">
<input message="tns:modifRequest" />
<output message="tns:modifResponse" />
</operation>
<operation name="update">
<input message="tns:modifRequest" />
<output message="tns:modifResponse" />
</operation>
</portType>
无论是在更新请求还是删除请求中,都会在SoapUI中生成以下SOAP客户端消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sim="simSchema">
<soapenv:Header/>
<soapenv:Body>
<sim:siListElement>
<!--1 or more repetitions:-->
<sim:si name="?" desc="?" workspace="workspace">
<!--Zero or more repetitions:-->
<sim:bp name="?" value="?" bps="?"/>
</sim:si>
</sim:siListElement>
所以似乎通过HTTP向WS发送的唯一内容是siListElement
。但是WS如何知道客户想要达到的操作(这里是删除/更新)?特别是在两种操作的输入具有相同结构的情况下。
答案 0 :(得分:6)
WS通过SOAPAction
HTTP标头了解操作。当您在SOAPUI中创建新的SOAP测试请求时,您必须选择操作并选择它,然后SOAPUI会自动为您设置操作请求将此操作映射到必要的SOAPAction
,它将在您运行时作为HTTP标头发送测试请求。
这&#34;魔法&#34;之所以发生,是因为在你的WSDL中肯定还有一个你在问题中遗漏的信息,它将wsdl:operation
与soap:operation
绑定在一起。在你的WSDL中可能有类似的东西:
<binding name="bindingDelete" type="siModificationPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="delete">
<soap:operation soapAction="delete"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<binding name="bindingAdd" type="siModificationPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="add">
<soap:operation soapAction="add"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
因此,当您向SOAPUI指定您的操作是删除时,SOAPUI正在使用正确的值发送SOAPAction
http标头,例如delete
,而不是您指定< strong>添加操作然后SOAPAction
http标头,其中包含add
之类的值。
您可以查看我在运行您的请求并点击SOAPRequest左侧的Raw
标签并检查您的操作类型的不同SOAPAction
值:
希望这有帮助,