我尝试编写我的PHP客户端Soap,它使用ASP.Net webservice,通过身份验证进行保护。 我的PHP代码是:
<?php
ini_set("soap.wsdl_cache_enabled", "0");
try {
$client = new SoapClient("https://www.webservicexxx.com:60443/service.asmx?WSDL", array('location' => 'https://webservicexxxcom:60443/service.asmx',
'login' => "myLogin", 'password' => "myPAssword"));
} catch (SoapFault $e) {
echo $e;
}?>
我收到此错误消息:
SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://www.webservicexxx.com:60443/service.asmx?WSDL' : failed to load external entity "https://www.webservicexx.com:60443/service.asmx?WSDL" in /var/www/webservice2/soap-client.php:5 Stack trace: #0 /var/www/webservice2/soap-client.php(5): SoapClient->SoapClient('https://www.web...', Array) #1 {main}
知道我在ubuntu服务器上的php.ini上启用了这个扩展:
extension = php_openssl.dll
extension = php_soap.dll
extension = php_curl.dll
当我尝试使用身份验证解析同一服务器上的另一个php webservice时,它可以工作:
try {
$client = new SoapClient("https://xx.xx.xx.xx:443/webservice1/notificationManager.wsdl", array('location' => 'http://xx.xx.xx.xx./webservice1/soap-server.php',
'login' => "myLogin", 'password' => "myPass"));
} catch (SoapFault $exception) {
echo $exception;
}
为什么我无法从第一个Web服务获得响应?
答案 0 :(得分:1)
我使用nusoap解决了这个问题。
$params = array(
"param" => "value"
);
$soap_client = new nusoap_client($wsdl_url, true);
$soap_client->setCredentials(USER_SERVICE, PASS_SERVICE, 'basic');
$soap_client->soap_defencoding = 'UTF-8'; //Fix encode erro, if you need
$soap_return = $soap_client->call("method_name", $params);
答案 1 :(得分:0)
为什么我无法从第一个网络服务获得响应?
因为无法加载外部实体
https://www.webservicexx.com:60443/service.asmx?WSDL
确保PHP的SoapClient
可以访问和访问WSDL,您不应该再遇到问题。
编辑:根据您的评论,WSDL URL需要HTTP身份验证。 PHP SoapClient
仅支持使用soap端点进行此类身份验证,但不支持WSDL http请求。这就是您看到失败的错误的原因。这与:
解决方案是请求您自己的WSDL文件并将SoapClient指向它的副本。有关详细信息,请参阅链接的问题。