使用SoapClient调用多个具有相同名称的方法

时间:2018-01-15 13:35:18

标签: php soap soap-client

我有一个SOAP Web服务,在SOAP UI中,我看到有些方法具有相同的名称。因此,例如,有2个CreateNewContact方法,其中一个采用3个参数,另外4个。下面是SOAP UI生成的存根

方法1存根:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rfp="http://test.com/testWebservice/">
   <soapenv:Header/>
   <soapenv:Body>
      <rfp:CreateNewContact_FullName>
         <!--Optional:-->
         <rfp:fullName>?</rfp:fullName>
         <!--Optional:-->
         <rfp:email>?</rfp:email>
         <!--Optional:-->
         <rfp:telNo>?</rfp:telNo>
      </rfp:CreateNewContact_FullName>
   </soapenv:Body>
</soapenv:Envelope>

方法2存根:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rfp="http://test.com/testWebservice/">
   <soapenv:Header/>
   <soapenv:Body>
      <rfp:CreateNewContact_FirstLastName>
         <!--Optional:-->
         <rfp:firstName>?</rfp:firstName>
         <!--Optional:-->
         <rfp:lastName>?</rfp:lastName>
         <!--Optional:-->
         <rfp:email>?</rfp:email>
         <!--Optional:-->
         <rfp:telNo>?</rfp:telNo>
      </rfp:CreateNewContact_FirstLastName>
   </soapenv:Body>
</soapenv:Envelope>

当我使用PHP SoapClient调用带有4个参数的CreateNewContact方法时,看起来我正在从另一个方法获得响应。

如何使用SoapClient指定使用哪种方法?

谢谢,

2 个答案:

答案 0 :(得分:4)

您可以阅读here

  

如果您使用的是基于WSDL的SOAP请求,并且您有多个   在您的绑定操作中(使用相同的参数),请确保    样式设置为rpc,而不是正文!当您指定   这里的“ body”,将在请求中传输的全部是   函数调用的参数,并且 SoapServer-> handle()将使用   它找到的第一个具有相同参数组成的函数要处理   通话。实际的调用方法仅包含在   当您的类型设置为“ rpc”时请求   行为

因此,您应该在WSDL中检入operation element,它提供了从抽象操作到具体SOAP操作的绑定信息。
例如:

<definitions ....>;
    <binding .... >;
        <operation .... >;
           <soap12:operation soapAction="xs:anyURI" ?
                              soapActionRequired="xs:boolean" ?
                              style="rpc|document" ?
                              wsdl:required="xs:boolean" ? /> ?
        </soap12:operation>
    </binding>;
</definitions>

style属性值(如果存在)是一个字符串,用于指定操作的样式。样式属性指示操作是面向RPC(包含参数和返回值的消息)还是面向文档(包含文档的消息)。如果从soap12:operation元素中省略了style属性,则该操作将继承包含wsdl:binding元素中soap12:binding元素所指定或隐含的样式。
因此,简而言之,要解决您的问题,应在WSDL中将操作样式从“文档”更改为“ rpc”。
进一步参考:https://bugs.php.net/bug.php?id=49169

答案 1 :(得分:0)

我在travelport通用API中也遇到了同样的问题,最终我修改了本地wsdl文件以为每种方法使用不同的名称,并且效果很好。