我想在php中使用SOAP webservices。当wsdl路径超过http协议时我获得了成功但是当我改为https时,这开始抛出以下异常。
SOAP-ERROR:解析WSDL:无法从“https://localhost:8443/../someWsdl.wsdl”加载:无法加载外部实体“https://localhost:8443/.../someWsdl.wsdl”
在创建SOAPClient对象时抛出此异常。我比较了http和https获得的wsdl文件,两者在一个地方除了webservice位置路径之外都有相同的内容。那么为什么要抛出异常呢?
我尝试过一些来自互联网的建议,但这对我不起作用:
我的要求是通过https协议访问webservices。当Web服务URL路径超过https协议时,是否还有其他选项需要在SoapClient构造函数中传递以创建SoapClient对象? 能否帮助我解决上述问题,并建议任何可用的参考文件。
更新: 这是我的代码:
$wsdl = "https://localhost:8443/.../someWsdl.wsdl"; $client = new SoapClient($wsdl, array( 'trace' => 1 ));
答案 0 :(得分:1)
我遇到类似的问题,这是由WSDL文件中的XML指定端口81时尝试使用HTTPS(应该是443)引起的。
<wsdl:service name="API">
<wsdl:port name="APISoap" binding="tns:APISoap">
<soap:address location="http://example.com:81/api.asmx"/>
</wsdl:port>
<wsdl:port name="APISoap12" binding="tns:APISoap12">
<soap12:address location="http://example.com:81/api.asmx"/>
</wsdl:port>
</wsdl:service>
我通过将PHP SoapClient的location
选项指定为我的WSDL文件来修复此问题。这明确强制该位置为HTTPS地址。片段:
$wsdl = "https://example.com/api.asmx?wsdl";
$SSL['verify_peer_name'] = true; // Verify the peer name from the WSDL hostname
$SSL['verify_peer'] = true; // Verify SSL connection to host
$SSL['disable_compression'] = true; // Helps mitigate the CRIME attack vector
$context['ssl'] = $SSL;
$options['location'] = $wsdl; // Force the endpoint to be HTTPS (WSDL returns endpoint as HTTP at Port 81)
$options['stream_context'] = stream_context_create($context);
$client = new SoapClient($wsdl, $options);