我的应用程序通常连接到第三方服务器以通过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
和
SoapClient::SoapClient(): I/O warning : failed to load external entity "http://[the-domain]:80/[path]?xsd=1"
当我查看WSDL XML文件时,看起来违规的可卸载文件是它试图导入的文档模式文件(schemaLocation):(来自WSDL ?
我一直在打击这个问题一段时间,据我所知,问题是两件事之一:
>当我在浏览器中加载该架构URL时(在浏览器身份验证之后),它会重定向到https url(并删除端口声明).尝试导入架构时,SOAP调用是否可能不遵循重定向?
>鉴于错误消息是401错误 – 在尝试导入架构时,SOAP调用是否可能没有传递凭据?模式文件需要与WSDL文件相同的身份验证,但是在尝试导入时服务器可能没有将身份验证扩展到模式?
假设这是第二个问题,是否有任何方法可以强制系统使用不同的架构URL而无需下载WSDL文件,编辑它,并在本地存储/引用它?如果是这样,我可以尝试传递URL中的凭据(http:// username:password @ domain ….)?
如果我唯一的注意事项是创建WSDL和XSD架构文件的修改副本,那么就这样吧,但我很想知道是否有人有任何想法可以让我避免这种情况(因为架构确实从时间变化 – 到时间).