php SoapClient:无法从外部实体加载(其中端点解析到另一个位置)

时间:2013-06-21 01:39:19

标签: php load entity external soap-client

我有一个类似于此的WSDL:

https://provider.web-service.domain/path/ServiceName?wsdl

它有这样的一行:

<wsdl:import namespace="http://name/space/service/" location="ServiceName.wsdl"></wsdl:import>

即。它试图在该位置导入另一个wsdl:

https://provider.web-service.domain/path/ServiceName.wsdl

因此,在初始化SoapClient时,我收到以下错误:

 PHP Fatal error:  SOAP-ERROR: Parsing WSDL:
 Couldn't load from 'https://provider.web-service.domain/path/ServiceName.wsdl' :
 failed to load external entity "https://provider.web-service.domain/path/ServiceName.wsdl"

我目前正在尝试使用我的WSDL提供程序解决此问题,但此问题是否有解决方法?

我猜测唯一的解决方案是让他们提供实际指向可访问资源的路径。事实上,我无能为力。

你的想法。

相关:

更新

提供商称PHP SOAP客户端SUX(基本上)。

更改了标题:

  • php SoapClient:无法从外部实体加载;到
  • php SoapClient:无法从外部实体加载(其中端点解析到另一个位置)

因此,PHP SoapClient不知道wsdl的url正在解析到另一个位置,因此它尝试从原始位置导入文件。

由于资源在原始位置不存在,因此会抛出错误。

作为一种解决方法,他们提供了WSDL,以便我们可以放置我们的服务器。

但是这个问题需要更好的解决方案。

更新2

为了清晰起见,我想重新提出问题:

我被要求使用以下WSDL URL:

[1] https://provider.web-service.domain/path/ServiceName?wsdl

以下位置有两个WSDL

[2] https://provider.web-service.domain/path/ServiceName/another/diff/path/prefix_ServiceName.wsdl
[3] https://provider.web-service.domain/path/ServiceName/another/diff/path/ServiceName.wsdl
  • [1]解析为[2];然后
  • [2]进口[3]

当将[1]传递给SoapClient()时,它是致命的(如前所述)

将[2]传递给SoapClient()时,它可以工作。

1 个答案:

答案 0 :(得分:0)

我在传递过程中必须做的事情,如果你真的想花时间做,你可以做的是:为soapclient创建一个包装类并预处理wsdls。 e.g。

class SoapClientCompatibility extends SoapClient{

    public function __construct($wsdl, $options){
        // do things here, like:
        // download the wsdl using curl
        // modify/check it, then hand it over as the $wsdl to parent::__construct
    }

}