php SoapClient在传递带有相对路径模式的wsdl时失败


php SoapClient fails when passed a wsdl with relative path schemas

我有以下问题:

当我向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身份验证