SOAP WS如何知道请求的操作?

时间:2014-08-20 17:25:56

标签: soap wsdl soapui

假设我的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如何知道客户想要达到的操作(这里是删除/更新)?特别是在两种操作的输入具有相同结构的情况下。

1 个答案:

答案 0 :(得分:6)

WS通过SOAPAction HTTP标头了解操作。当您在SOAPUI中创建新的SOAP测试请求时,您必须选择操作并选择它,然后SOAPUI会自动为您设置操作请求将此操作映射到必要的SOAPAction,它将在您运行时作为HTTP标头发送测试请求。

这&#34;魔法&#34;之所以发生,是因为在你的WSDL中肯定还有一个你在问题中遗漏的信息,它将wsdl:operationsoap: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值:

enter image description here

希望这有帮助,