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



我有一个类似于这样的WSDL:

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

有这样一行:

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

ie。它正在尝试在位置导入另一个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 SoapClient传递具有相对路径模式的wsdl时失败
  • https://issues.apache.org/jira/browse/axis2 - 484

提供者说PHP SOAP客户端SUX(本质上)。

更改标题为:

    php SoapClient:无法从外部实体加载;
  • php SoapClient: cannot Load from external entity (Where endpoint解析到另一个位置)

所以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()时,它会执行FATALs(如前所述)

当传递[2]到SoapClient()时,它工作。

我在过去必须做的,如果您真的想花时间做的话,您可以做的是:为soapclient创建一个包装器类,并对wsdl进行预处理。例如

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
    }
}

最新更新