0

我有一个类似于此的 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 SOAP Client 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() 时,它可以工作。

4

1 回答 1

1

过去我必须做的,如果你真的想花时间在上面,你可以做的是:为soapclient创建一个包装类并预处理wsdls。例如

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
    }

}
于 2014-06-04T20:30:51.387 回答