【问题标题】:PHP SoapClient Remap SoapAction in WSDL-mode?PHP SoapClient 在 WSDL 模式下重新映射 SoapAction?
【发布时间】:2016-08-12 18:04:06
【问题描述】:

我在尝试使用标准 PHP SoapClient 访问 SoapServer 上的方法时遇到问题。问题是 SoapServer 上的方法以相同的名称列出了两次,但操作不同。

例如: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-mode 中重新映射肥皂动作吗?

【问题讨论】:

  • 在开发应用程序时,总是在禁用缓存的情况下运行soap客户端。 $client = new SoapClient('somewhere.com/?wsdl', array('cache_wsdl' => WSDL_CACHE_NONE) );也许分享你的 wsdl 文件。此外,如果您使用禁用 WS-I 合规性并启用 WS-I 合规性模式的 SOAP,则两个 wsdl 文件都不同。

标签: php web-services soap wsdl


【解决方案1】:

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

  1. 获取 WSDL 网址
  2. 另存为本地文件
  3. 并更改那里的方法顺序(那些不好的应该是第一个)

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

【讨论】:

  • 是的,在 SoapClient 中覆盖该方法似乎是处理此问题的最干净的方法。我不想维护修改后的 wsdl。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多