我的应用程序通常连接到第三方服务器以通过 SOAP/WSDL 获取数据:
$this->soap_client = new SoapClient("https://[the-domain]:443/[path]?wsdl", array(
'trace'=>1,
'login'=>$this->username,
'password'=>$this->password,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE
)
去年一切都很好,但他们最近更新了 WSDL 文件,现在当应用程序尝试连接时我收到以下两个错误:
SoapClient::SoapClient(http://[the-domain]:80/[path]?xsd=1): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
and
SoapClient::SoapClient(): I/O warning : failed to load external entity "http://[the-domain]:80/[path]?xsd=1"
当我查看 WSDL XML 文件时,有问题的不可加载文件似乎是它尝试导入的文档架构文件 (schemaLocation):(来自 WSDL:)
<types>
<xsd:schema>
<xsd:import namespace="[irrelevant]" schemaLocation="http://[the-domain]:80/[path]?xsd=1"/>
</xsd:schema>
</types>
一段时间以来,我一直在努力反对这个问题,据我所知,问题是以下两件事之一:
- 当我在浏览器中加载该架构 URL 时(浏览器身份验证后)
302 redirects
to a https
url(并删除端口声明)。尝试导入架构时,SOAP 调用是否可能不会遵循重定向?
- 鉴于错误消息是 401 错误 - 尝试导入架构时 SOAP 调用是否可能未传递凭据?模式文件需要与 WSDL 文件相同的身份验证,但服务器在尝试导入时可能没有将身份验证扩展到模式?
假设这是第二个问题,有什么方法可以强制系统使用不同的架构 URL,而无需下载 WSDL 文件、编辑它并在本地存储/引用它?如果是这样,我可以尝试在 URL 中传递凭据(http://username:password@domain....
)?
如果我唯一的想法是创建 WSDL 和 XSD 模式文件的修改副本,那就这样吧,但我很想听听是否有人有任何想法可以让我避免这种情况(因为模式确实会随着时间而改变 -到时间)。