我有一个类似于这样的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
}
}