我有一个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指定使用哪种方法?
谢谢,
答案 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文件以为每种方法使用不同的名称,并且效果很好。