Почему мой SOAP-запрос не работает? - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь сделать SOAP-запрос с помощью PHP.Кажется, что мой запрос совпадает с запросом, подробно описанным в документации сервера SOAP (но с немного другими методами), но я получаю ошибку аутентификации, как будто заголовок не включен.

Пример запроса документации

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <AuthHeader xmlns="http://novosolutions.com/">
      <SessionId>string</SessionId>
    </AuthHeader>
  </soap:Header>
  <soap:Body>
    <ViewTicket xmlns="http://novosolutions.com/">
      <Id>int</Id>
    </ViewTicket>
  </soap:Body>
</soap:Envelope>

Запрос выводит мой PHP-код:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://novosolutions.com/">
    <SOAP-ENV:Header>
        <ns1:AuthHeader>
            <SessionId>623</SessionId>
        </ns1:AuthHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:ViewTicket>
            <Id>1355110</Id>
        </ns1:ViewTicket>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Мой PHP-код довольно прост.Я что-то не так делаю?

$url = URL_BASE . URL_TICKET . '?WSDL';
$soapStruct = new SoapVar(array('SessionId' => SESSION_ID), SOAP_ENC_OBJECT);
$header = new SoapHeader('http://novosolutions.com/', 'AuthHeader', $soapStruct, false);

try {
    $client = new SoapClient($url, array('trace' => 1));
}
catch (SoapFault $exception) {
    echo 'Exception='.$exception;
}
$client->__setSoapHeaders(array($header));
var_dump($client);

$soapData = new SoapVar(array('Id' => 1355110), SOAP_ENC_OBJECT);
$result = $client->__soapCall('ViewTicket', array('parameters' => $soapData));

var_dump($result);
echo $client->__getLastRequest();

РЕДАКТИРОВАТЬ: проверяя запрос с помощью curl, я сузил его до того факта, что PHP SoapClient использует переменную для пространства имен.не принимается SoapServer, но есть.Теперь мне просто нужно выяснить, как запретить SoapClient использовать переменные.

1 Ответ

0 голосов
/ 18 января 2012

Вы просто попробовали это?

error_reporting(E_ALL);
$client = new SoapClient($url,array('trace' => 1));
$client->__setSoapHeaders( new SoapHeader($url, 'SessionId', SESSION_ID) );
$result = $client->ViewTicket(array('Id'=>1355110));
var_dump($result);
echo '<hr>',str_replace('<','&lt;',$client->__getLastRequest());

Какого рода сообщение об ошибке выдает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...