Вызов функции PHP SOAP, возвращающий ошибку - PullRequest
3 голосов
/ 08 февраля 2012

Возникли проблемы с базовой настройкой PHP / SOAP

Я пишу SOAP-клиент на PHP для общения с существующим SOAP-сервером. Он также использует WS-Security.

Я успешно смог подключиться (аутентифицироваться) и выполнить вызов __getFunctions, который возвращает массив доступных функций, используя следующий код:

<?php

$wsdlPath = "https://xxx.xxx.xxx.xxx/services/Service?wsdl";

$ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
$token = new stdClass;
$token->Username = new SOAPVar('xUSERx', XSD_STRING, null, null, null, $ns);
$token->Password = new SOAPVar('xPASSx', XSD_STRING, null, null, null, $ns);

$wsec = new stdClass;
$wsec->UsernameToken = new SoapVar($token, SOAP_ENC_OBJECT, null, null, null, $ns);

$headers = new SOAPHeader($ns, 'Security', $wsec, true);

if (!$client)
{
    $client = new SoapClient($wsdlPath);
    echo "Conn:YES";
}
else
{
    echo "Conn:NO";
}

$client->__setSOAPHeaders($headers);

try
{
   print_r($client->__getFunctions());    
}
catch (SoapFault $exception)
{
   print($exception); 
}

?>

Что дает следующий результат (грязно, но вы поняли):

Conn:YES
Array (
    [0] => editChannelResponse editChannel(editChannel $parameters)
    [1] => getDownloadTokenResponse getDownloadToken(getDownloadToken $parameters)
    [2] => startCallResponse startCall(startCall $parameters)
    [3] => getCallsResponse getCalls(getCalls $parameters)
    [4] => endCalendarCallResponse endCalendarCall(endCalendarCall $parameters)
    [5] => createChannelResponse createChannel(createChannel $parameters)
    [6] => getArchivesByCallIdsResponse getArchivesByCallIds(getArchivesByCallIds $parameters)
    [7] => getChannelsResponse getChannels(getChannels $parameters)
    [8] => createVRRResponse createVRR(createVRR $parameters)
    [9] => getTemplateResponse getTemplate(getTemplate $parameters)
    [10] => getTemplatesResponse getTemplates(getTemplates $parameters)
    [11] => getCallsByStatusResponse getCallsByStatus(getCallsByStatus $parameters)
    [12] => getCallResponse getCall(getCall $parameters)
    [13] => startCalendarCallResponse startCalendarCall(startCalendarCall $parameters)
    [14] => deleteChannelResponse deleteChannel(deleteChannel $parameters)
    [15] => editVRRResponse editVRR(editVRR $parameters)
    [16] => deleteVRRResponse deleteVRR(deleteVRR $parameters)
    [17] => getLiveStreamingsResponse getLiveStreamings(getLiveStreamings $parameters)
    [18] => getHashedPasswordResponse getHashedPassword(getHashedPassword $parameters)
    [19] => getVersionResponse getVersion(getVersion $parameters)
    [20] => endCallResponse endCall(endCall $parameters)
    [21] => getVRRsResponse getVRRs(getVRRs $parameters)
    [22] => getNumberOfArchivesResponse getNumberOfArchives(getNumberOfArchives $parameters)
    [23] => getArchivesResponse getArchives(getArchives $parameters)
    [24] => getVRRResponse getVRR(getVRR $parameters)
)

Но когда я пытаюсь вызвать одну из перечисленных функций напрямую (getVersion), заменив

print_r($client->__getFunctions());

с

print_r($client->getVersion());

Я получаю следующую ошибку

Conn:YES
SoapFault exception: [soap:Server] 
Fault occurred while processing. in /var/data/www/xxx/beta/soap.php:29 
Stack trace: #0 [internal function]: SoapClient->__call('getVersion', Array) #1 
/var/data/www/xxx/beta/soap.php(29): SoapClient->getVersion() #2 {main}

Я не вижу никакой полезной информации в сообщении об ошибке, и функция, которую я вызываю, является одной из перечисленных доступных опций, и я считаю, что мой синтаксис правильный.

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Можете ли вы попробовать «вручную» вызвать вызов этой функции?

$response = $client->__doRequest( $postdata, 'soaplistenerurl', 'getVersion', 1 );

Что это дает?

0 голосов
/ 08 февраля 2012

Вы можете попробовать запустить SoapClient с параметром:

$client = new SoapClient($wsdlPath, array("trace" => true, "exceptions" => true));

Если исключение

  • true, любая ошибка вызовет Exception.
  • false, вы получите объект $client, содержащий сообщение soapFault.
...