在https协议上访问SOAP Web服务抛出异常SOAP-ERROR:解析WSDL

时间:2015-06-11 12:36:08

标签: php web-services soap wsdl

我想在php中使用SOAP webservices。当wsdl路径超过http协议时我获得了成功但是当我改为https时,这开始抛出以下异常。

  

SOAP-ERROR:解析WSDL:无法从“https://localhost:8443/../someWsdl.wsdl”加载:无法加载外部实体“https://localhost:8443/.../someWsdl.wsdl

在创建SOAPClient对象时抛出此异常。我比较了http和https获得的wsdl文件,两者在一个地方除了webservice位置路径之外都有相同的内容。那么为什么要抛出异常呢?

我尝试过一些来自互联网的建议,但这对我不起作用:

  1. 在php中启用soap,openssl。
  2. 在SoapClient调用的构造函数中将local_cert作为选项传递给本地证书路径。
  3. 将wsdl位置传递为https://oc_username:oc_password@localhost:8443/OpenClinica-ws/ws/study/v1/studyWsdl.wsdl以登录openclinica,然后访问webservice。
  4. 我的要求是通过https协议访问webservices。当Web服务URL路径超过https协议时,是否还有其他选项需要在SoapClient构造函数中传递以创建SoapClient对象? 能否帮助我解决上述问题,并建议任何可用的参考文件。

    更新: 这是我的代码:

    $wsdl = "https://localhost:8443/.../someWsdl.wsdl"; $client = new SoapClient($wsdl, array( 'trace' => 1 ));
    

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);