【问题标题】:Calling multiple methods with same name using SoapClient使用 SoapClient 调用具有相同名称的多个方法
【发布时间】:2018-01-15 13:35:17
【问题描述】:

我有一个 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 指定要使用的方法?

谢谢,

【问题讨论】:

  • 方法CreateNewContact()的所有不同版本是如何实现的?或者更确切地说,CreateNewContact() 是如何实现的?跟踪它,您可能已经成功解决问题了。如果您不介意,您可以在这里Copy-Paste 部分内容....
  • 我已经包含了由 SoapUI 生成的单独方法的存根。不确定是否足够。你怎么看?

标签: php soap soap-client


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多