2016-08-12 121 views
6

我有一个问题,我试图使用标准的PHP SoapClient访问SoapServer上的方法。问题是SoapServer上的方法列出了两次具有相同的名称,但操作不同。PHP SoapClient重新映射WSDL模式下的SoapAction?

例如:SOAP UI显示两次列出GetStockQuote和GetStockQuote,但第二个GetStockQuote实际上是要调用GetStockQuoteV2。

但是我的PHP SoapClient,如果我调用$ client-> GetStockQuote,它会自动调用第一个。从我的研究中,我不得不这样做。

$client->__soapCall('GetStockQuote', array($request), array('soapaction'=>'GetStockQuoteV2')); 

但是,当我在wsdl模式下,它仍然调用GetStockQuote而不是GetStockQuoteV2。

我的结论是,我必须以非wsdl模式运行,并处理这种烦恼。当处于非wsdl模式时,上面的__soapCall似乎在调用正确的方法,但由于我处于非wsdl模式,我认为构建服务器所需的适当的AuthHeader存在问题。

我的问题是,我可以在PHP SoapClient wsdl模式中重新映射soap动作吗?

+0

始终在开发应用程序时禁用高速缓存的情况下运行soap客户端。 $ client = new SoapClient('http://somewhere.com/?wsdl',array('cache_wsdl'=> WSDL_CACHE_NONE));也许分享你的wsdl文件。另外,如果您正在使用具有禁用的WS-I兼容性的SOAP,并且启用了WS-I兼容模式,那么这两个wsdl文件都是不同的。 –

回答

2

这是一个丑陋的解决方法,但正如我们在这里看到的那样 - 您在另一面有难看的Soap服务。

  1. 采取WSDL URL
  2. 保存为本地文件
  3. ,然后在那里方法顺序(那些不好的应该是1)

另一种解决方案。您可以扩展SoapClient,并在方法A中实际调用远程方法B.

+0

是的,重写SoapClient中的方法似乎是解决这个问题最简单的方法。我不想保持修改的wsdl。 – Halfstop