我有以下问题:
当我向SoapClient对象传递使用相对路径导入模式的wsdl时,它的实例化失败。(根据我的研究,我相信情况确实如此)
我的代码如下:
$wsdl = 'http://myproxy/webservice?wsdl';
$options = array( /* options */ );
$client = new SoapClient($wsdl, $options);
wsdl:的模式导入部分
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://myprovider/namespace1/namespace1" schemaLocation="schema1.xsd"/>
<import namespace="http://myprovider/namespace1/namespace2" schemaLocation="schema2.xsd"/>
<import namespace="http://myprovider/namespace1/namespace3" schemaLocation="schema3.xsd"/>
</schema>
我得到的错误:
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://myproxy/webservice?wsdl' : Extra content at the end of the document
研究让我找到了这样的文章:
https://issues.apache.org/jira/browse/AXIS2-484
据我所知,我似乎有两个选择:
- 让我的提供者将架构路径更改为绝对路径
- 让我的提供者给我一份架构的副本,这样我就可以在调用
SoapClient
的服务器上托管
模式的相对路径意味着SoapClient在解析wsdl时,将尝试使用代理作为引用来访问模式文件,如下所示:
http://myproxy/schema1.xsd
由于我没有xsd文件,这将导致SoapClient抛出错误。
这个问题的解决方案是消除代理,这样到外部资源的相对路径就不会受到影响。解决方案可以在这里找到:
扩展phpSoapClient进行siteminder身份验证