使用SoapClient类在PHP中的Soap请求中删除param0

使用SoapClient类在PHP中的Soap请求中删除param0,php,web-services,soap,Php,Web Services,Soap,我正在尝试使用SoapClient从PHP代码调用web服务 $service = new SoapClient($wsdl); $service->myFunction('something', 'anotherthing', 'onemore'); 如果打开跟踪并获取最后一个请求,我可以看到Soap消息中始终缺少第一个参数,即param0从不存在。在参数较少或较多的函数中也是如此 Soap请求: <SOAP-ENV:Envelope xmlns:SOAP-ENV="http:/

我正在尝试使用
SoapClient
从PHP代码调用web服务

$service = new SoapClient($wsdl);
$service->myFunction('something', 'anotherthing', 'onemore');
如果打开跟踪并获取最后一个请求,我可以看到Soap消息中始终缺少第一个参数,即
param0
从不存在。在参数较少或较多的函数中也是如此

Soap请求:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <myFunction />
    <param1>anotherthing</param1>
    <param2>onemore</param2>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我正在Windows XP上使用Xamplite

更新:是指向有相同问题的人的链接(2008年发布,没有答案:())

更新2:我还注意到它没有将表示参数的xml元素作为表示函数的元素的子元素。这不可能是正确的

我做了一个可怕的修复,重载了uu doRequest函数并编辑了$request变量。它工作正常,但很糟糕。我还不如自己编译整个请求

更新3:对我来说,感觉PHP只是出了故障。但如果这是soap实现中的一个bug,我想在web上会有更多关于它的信息。aaaargh。下一个尝试是尝试NuSoap和PEAR


更新4:为了圆满解决这个问题,我没有尝试NuSoap和PEAR。我只是选择了我的“hack”,因为它有效,还有其他需要做的活动。此外,演示已经给出,下一阶段将不再使用PHP。因此,整个过程将重新实现。

您可以看到SoapClient通过e发送的内容扩展方法并调试
$request
参数

或者,也可以使用,但我过去在调用生成异常(即:不符合WDSL)时遇到了一些问题,在
doRequest
中,您可以在发送之前检查XML


请确保传递参数的工作方式与预期一致,并且您的问题可能在于您发送的实际变量,或者调用与WSDL中指定的操作不匹配。

TL;DR version:您错误地调用了SOAP方法。请将参数放在数组中,而不是将它们作为单独的变量PHP的_调用()的参数

我也有同样的问题,这真的让我很难受。我猜我只是把头撞在墙上的时间长了一点。我发现我在做:

$soapclient = new SoapClient($uri);
$soapclient->MethodName($param0, $param1, $param2);
奇怪的是,它创建了SOAP XML,如下所示:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName/>
<param1>$param1</param1>
<param2>$param2</param2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName>
<param0>$param0</param0>
<param1>$param1</param1>
<param2>$param2</param2>
</MethodName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这将创建SOAP XML,如下所示:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName/>
<param1>$param1</param1>
<param2>$param2</param2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName>
<param0>$param0</param0>
<param1>$param1</param1>
<param2>$param2</param2>
</MethodName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

$0
$1
$2

事后看来,有点明显——但我可以看出我是如何将SOAP参数误认为也是PHP参数的!

我的意思是获取最后一个请求是调用u getLastRequest()。我编辑了我的问题,以显示u getLastRequest()返回的SOAP请求。我来看看doRequest()是什么向我显示。doRequest报告相同。我猜有道理:)。然而,这给了我在doRequest重载中添加param0的想法。也许不是最优雅的解决方案,但它符合问题的优雅。。。。。。。。。我将报告它是否有效。您是否尝试过不同的操作(或者更好,尝试过不同的WSDL)?也许就是这个具体的操作。您必须确定问题是出在SoapClient还是WSDL上。我在SoapUI中测试了WSDL,SoapUI通过查看WSDL生成的soap请求要好得多,因为它们工作正常!谢谢你的回复。这可能真的是问题的原因。我再也不能访问那个特定的代码了,所以测试它会很困难。然而,如果我查看我的原始文本,我发现我键入的错误也发生在这个调用中:“uuSOAPCall('myFunction',array($something,$anotherthing,$onemore));”。我做错了什么?在这种情况下,你也会遇到同样的错误吗?如果我有时间在家,我会尝试再次设置并测试它以确保安全。我将把它放在我的谷歌待办事项列表中:)。我已经尝试了u soapCall,并且使用了有序数组和关联数组。从记忆中看,这对我没有帮助——尽管现在我觉得是的,你会期望它起作用。(不幸的是,所有这些失败的尝试都不在SVN中,所以我不能确定,呵呵)
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<MethodName>
<param0>$param0</param0>
<param1>$param1</param1>
<param2>$param2</param2>
</MethodName>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>