Клиент SOAP-ERROR: разбор WSDL с ошибкой аутентификации

Я пытаюсь закодировать свое клиентское мыло PHP, которое использует веб-сервис ASP.Net, защищенное аутентификацией. Мой 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}

зная, что я включил это расширение в моем php.ini на сервере Ubuntu:

extension = php_openssl.dll
extension = php_soap.dll
extension = php_curl.dll

и когда я пытаюсь проанализировать другой веб-сервис php на том же сервере с аутентификацией, он работает:

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

Почему я не могу получить ответ от первого веб-сервиса?


person Saad Lamarti    schedule 02.11.2012    source источник
comment
просто скопируйте и вставьте URL-адрес wsdl в свой браузер, чтобы увидеть, видите ли вы wsdl. Делая это, вы уверены, что это не проблема подключения.   -  person slash28cu    schedule 02.11.2012
comment
Файл wsdl https://www.webservicexx.com:60443/service.asmx?WSDL доступен через интернет-браузер и требует аутентификации.   -  person Saad Lamarti    schedule 02.11.2012


Ответы (2)


Я решил это с помощью 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);
person Liko    schedule 02.02.2015

Почему я не могу получить ответ от первого веб-сервиса?

Поскольку не удалось загрузить внешний объект

https://www.webservicexx.com:60443/service.asmx?WSDL

Убедитесь, что WSDL доступен и доступен для PHP SoapClient, и у вас больше не должно быть проблем.

Изменить. Согласно вашим комментариям, для URL-адреса WSDL требуется HTTP-аутентификация. PHP SoapClient поддерживает этот тип аутентификации только с конечной точкой soap, но не с HTTP-запросом WSDL. Вот почему вы видите ошибку, что это не удалось. Это связано с:

Решение состоит в том, чтобы запросить собственный файл WSDL и указать SoapClient его копию. См. связанный вопрос для получения дополнительной информации.

person hakre    schedule 02.11.2012
comment
Веб-сервис https://www.webservicexx.com:60443/service.asmx?WSDL доступен через любой навигатор и требует логин и пароль для доступа к файлу wsdl. Я не знаю, нужно ли мне настраивать свой сервер или обращаться к поставщику веб-сервиса?? - person Saad Lamarti; 02.11.2012
comment
Под навигатором я думаю, вы имеете в виду свой интернет-браузер, верно? Если он требует имя пользователя и пароль, это означает, что он использует HTTP-аутентификацию (Basic Auth). См. раздел WSDL в PHP с базовой аутентификацией, который, вероятно, является следующим вопросом, который у вас есть сейчас. - person hakre; 02.11.2012
comment
Я все еще получаю сообщение об ошибке, при котором не удалось загрузить внешний объект при использовании основных методов аутентификации, я пробовал это раньше. Вы думаете, что мне нужно что-то настроить на сервере Ubuntu? или я должен связаться с поставщиком веб-сервиса? - person Saad Lamarti; 02.11.2012
comment
Я попытался решить свою проблему, используя следующие методы: http://fr2.php.net/manual/en/soapclient.soapclient.php#101503 и https://bugs.php.net/bug.php?id=27777! у меня та же проблема - person Saad Lamarti; 02.11.2012
comment
Проблема не в поставщике веб-сервиса. Проблема в том, что PHP SoapClient не может загрузить WSDL с базовой аутентификацией. Проблема может быть решена только в том случае, если вы сначала сохраните WSDL на свой диск, а затем предоставите его через URI WSDL, который SoapClient может загрузить. Комментарий пользователя 101503 показывает, как это сделать. Я мог бы представить, что есть и другие способы, как это сделать, но они похожи на то, что уже было изложено, поэтому я не знаю, какую информацию вам не хватает. - person hakre; 02.11.2012