Лично мне никогда не удавалось получить заголовки так, как я хотел, при использовании класса SoapHeader
. Чтобы быть более гибким, вы, возможно, должны принять во внимание пользовательский класс SoapClient
. Как я ответил в на другой вопрос о SO, вы можете структурировать SOAP-сообщение в соответствии с вашими потребностями при переопределении SoapClient::__doRequest()
. Таким образом, вы можете вставлять фрагменты XML по своему желанию.
class My_SoapClient extends SoapClient
{
protected function __doRequest($request, $location, $action, $version)
{
/*
* $request is a XML string representation of the SOAP request
* that can e.g. be loaded into a DomDocument to make it modifiable.
*/
$domRequest = new DOMDocument();
$domRequest->loadXML($request);
// modify XML using the DOM API, e.g. get the <s:Header>-tag
// and add your custom headers
$xp = new DOMXPath($domRequest);
$xp->registerNamespace('s', 'http://www.w3.org/2003/05/soap-envelope');
$headers = $xp->query('/s:Envelope/s:Header');
if ($headers->length == 0) {
$envelope = $xp->query('/s:Envelope')->item(0);
$header = $domRequest->createElementNS('http://www.w3.org/2003/05/soap-envelope', 's:Header');
$envelope->appendChild($header);
} else {
$header = $headers->item(0);
}
// now add your custom header
$requestServerVersion = $domRequest->createElementNS('T_NAMSPACE', 't:RequestServerVersion');
$requestServerVersion->setAttribute('Version', 'Exchange2007_SP1');
$header->appendChild($requestServerVersion);
$request = $domRequest->saveXML();
return parent::__doRequest($request, $location, $action, $version);
}
}
T_NAMSPACE
необходимо изменить на правильное пространство имен префикса t
.