我有一个类似于此的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不知道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]传递给SoapClient()时,它是致命的(如前所述)
将[2]传递给SoapClient()时,它可以工作。
答案 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
}
}