Мыльный клиент, как вызвать функцию через HTTPS с базовой HTTP-аутентификацией

Эта проблема убивала меня весь день.

У меня есть клиентская веб-служба https: // * .asmx? WSDL с базовой HTTP-аутентификацией ..

Если я использую SoapUI для подключения к веб-сервису, все работает отлично, без каких-либо ошибок ..

Проблема в том, что когда я переключаюсь на PHP ...

Мне удалось подключиться к нему, и я могу получить список функций с сервера, используя расширение soapclient для php (я использую PHP 5.3.0).

Когда я пытаюсь вызвать функцию с помощью расширения soapclient для PHP, я получаю следующую ошибку:

Неустранимая ошибка: Неперехваченное исключение SoapFault: [HTTP] Ошибка при получении заголовков http в C: \ www \ xpto_Atestes \ soapclient.php: 26 Трассировка стека: # 0 [внутренняя функция]:> SoapClient -> __ doRequest ('* ** ... ',' http: // * *** ... ', 1, 0) # 1> C: \ www \ xpto_Atestes \ soapclient.php (26): SoapClient -> __ soapCall ('login', Array) # 2 {main}> брошено в C: \ www \ xpto_Atestes \ soapclient.php в строке 26

Более четкая ошибка (когда я делаю print_r результата вызова):

[faultstring] => Ошибка при получении заголовков http
[код ошибки] => HTTP

Со следующими отправляемыми заголовками:

POST /< sizes** .pt Подключение: Keep-Alive User-Agent: > PHP-SOAP / 5.3.0 Content-Type: text / xml; charset = utf-8 SOAPAction: "http: // * * / Login"> Content-Length: 264 Авторизация: Базовая AUTHSECRETPASS

Я называю это так:

$ soapParams = array ('login' => 'HTTP_LOGIN',
'password' => 'HTTP_PASS',
'authentication' => SOAP_AUTHENTICATION_BASIC,
'trace' => 1,
' exceptions '=> 0
);
$ client = new SoapClient ("https: // * *** .asmx? WSDL", $ soapParams ); echo "Подключено
"; $ params = array ('account' => '', 'msisdn' => 'NUMBER', 'password' => 'PASSWORD'); $ result = $ client -> __ soapCall ("логин", $ params);

После некоторого поиска в Google и попыток выяснить, в чем может быть проблема, я переключился на nusoap ... который, к моему несчастью, также выдал ошибку:

Ошибка

Ошибка HTTP: истекло время чтения заголовков сокетом

Запрос

POST /< 1x*** .pt Пользовательский агент: NuSOAP / 0.9. 5 (1.123) Content-Type: text / xml; charset = ISO-8859-1 SOAPAction: "http: // * *** / Login" Авторизация: Базовая AUTHSECRETPASS Длина содержимого: 481

НОМЕР ПАРОЛЬ

Ответ

Я называю это так:

$ client = new nusoap_client ("https: // * * .asmx? WSDL", true);
$ client-> setCredentials ('HTTPUSER', ' HTTPPASS ',' basic ');
$ params = array (' account '=>' ',' msisdn '=>' NUMBER ',' password '=>' PASSWORD ');
$ result = $ client-> call ('Логин', $ params);

С помощью nusoap я также попытался включить расширение curl для выполнения вызовов:

$ client-> setUseCurl (правда);

Но не тут-то было, продолжал выдавать ошибку:

Ошибка HTTP: ОШИБКА cURL: 56: Сбой при получении данных с однорангового URL: http: // * ** * ** * ** .asmx
content_type:
http_code: 0
header_size: 0
request_size: 750
filetime: -1
ssl_verify_result: 0
redirect_count : 0
total_time: 21.015
namelookup_time: 0
connect_time: 0
pretransfer_time: 0
size_upload: 462
size_download: 0
speed_download: 0
speed_upload: 21
download_content_length: -1
upload_content_length: -1
starttransfer_time: 0
redirect_time: 0

Я на 100% уверен, что с веб-сервисом все в порядке, если я могу без проблем вызвать его из SoapUI, я не понимаю, почему я не могу вызвать его из PHP.

Я ралли, не знаю, что еще могу ... Думаю, все перепробовала ...

Изменить: я только что попробовал другой класс Soap для PHP, на этот раз от Zend ..

Результат:

Неустранимая ошибка: неперехваченное исключение SoapFault: [WSDL] SOAP-ERROR: синтаксический анализ WSDL: не удалось загрузить из https: // * * .asmx? WSDL: не удалось для загрузки внешнего объекта "https: // * .asmx? WSDL" в C: \ www \ xpto_Atestes \ Zend \ Soap \ Client \ Common.php: 51 Трассировка стека :
# 0 C: \ www \ xpto_Atestes \ Zend \ Soap \ Client \ Common.php (51): SoapClient-> SoapClient ('https: // * * ... ', массив)
# 1 C: \ www ** * * _Atestes \ Zend \ Soap \ Client.php (1032): Zend_Soap_Client_Common -> __ construct (Массив, 'https: // * * ...', Массив)
# 2 C: \ www ** ** _Atestes \ Zend \ Soap \ Client.php (1188): Zend_Soap_Client -> _ initSoapClientObject ()
# 3 C: \ www ** * _Atestes \ Zend \ Soap \ Client.php (1112): Zend_Soap_Client-> getSoapClient () # 4 [внутренняя функция]: Zend_Soap_Client -> __ call ('Login', Array)
# 5 C: \ www ** ** _Atestes \ zend.php (28): Zend_Soap_Client-> Логин (массив)
# 6 {ma in} добавлено


person Tio    schedule 10.02.2011    source источник
comment
Здравствуйте, Тио, у меня точно такая же проблема (безуспешно попробуйте с Zend и NuSoap). Удалось ли вам заставить ее работать? Спасибо, Ив.   -  person    schedule 04.03.2011
comment
@yjusot ... ну, мне удалось решить проблему с NuSoap, WSDL веб-сервиса, требовал, чтобы различные поля имели префикс, а NuSoap не помещал их ... поэтому я изменил код NuSoap, чтобы добавить префикс в поля, но я рекомендую вам использовать метод $ client- ›send, в котором вы передаете XML запроса в качестве параметра, таким образом вам не нужно ничего менять ... если вам нужен пример, скажите что-нибудь ...   -  person Tio    schedule 07.03.2011
comment
Не могли бы вы подробнее рассказать о своем обходном пути / решении? т.е. какие префиксы?   -  person    schedule 21.10.2011


Ответы (1)


Просто чтобы ответить себе, на случай, если кто-то еще захочет узнать, как я это решил.

Проблема заключалась в следующем: XML-запрос одного из веб-сервисов должен был быть в таком формате:

<?xml version="1.0" encoding="utf-8" ?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns123:IsTokenValid xmlns:ns123="http://www.xxxxxxx.com">
            <ns123:token xsi:type="xsd:string">'.$this->loginToken.'</ns123:token>
        </ns123:IsTokenValid>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Когда я упоминаю приставку, я имею в виду часть ns123. Проблема в том, что ни одна из библиотек не создала правильный XML для отправки на сервер, они никогда не поместили бы префикс, поэтому запрос никогда не работал.

Сначала я решил это, перейдя непосредственно к классу NuSoap и изменив код в одном из классов, но затем я обнаружил, что могу сделать свой собственный XML-запрос с помощью NuSoap, что привело к следующему коду:

$nsValue = rand(1000, 9000);
$requestXml = '<?xml version="1.0" encoding="utf-8" ?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns'.$nsValue.':IsTokenValid xmlns:ns'.$nsValue.'="http://www.xxxxxxx.com">
<ns'.$nsValue.':token xsi:type="xsd:string">'.$this->loginToken.'</ns'.$nsValue.':token>
</ns'.$nsValue.':IsTokenValid>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>';
$result = WebService::CallWebService($this->endPoint, 'http://www.xxxxxxx.com/IsTokenValid', $requestXml, $this->httpUser, $this->httpPass);

WebService :: CallWebService - это просто оболочка для класса NuSoap, который делает что-то вроде этого (а также имеет обработку ошибок, устанавливает HTTP-аутентификацию и т. Д.):

$client = new nusoap_client($webServiceLink, false);
$result = $client->send($request, $soapAction, '', self::$timeout, self::$responseTimeout);

Иэн и все остальные, надеюсь, это ясно.

person Tio    schedule 21.10.2011