我需要使用 SoapHeader() 调用将此 .NET 语法转换为 PHP。
esb.RequestServerVersionValue = new RequestServerVersion(); esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
非常感谢!:)
我需要使用 SoapHeader() 调用将此 .NET 语法转换为 PHP。
esb.RequestServerVersionValue = new RequestServerVersion(); esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
非常感谢!:)
$soapHeader = new SoapHeader(
'http://schemas.microsoft.com/exchange/services/2006/types',
'RequestServerVersion Version="Exchange2007_SP1"'
);
$client->__setSoapHeaders($soapHeader);
这基本上就是真正需要设置的所有内容。我对命名空间设置感到困惑。奇怪的是,使用公用文件夹时需要 RequestServerVersion 标头,但在 Exchange 2007 中使用邮箱项目时似乎不需要。
这个链接特别有用:http ://www.zimbra.com/forums/developers/5532-php-soap-vs-zimbra.html因为它向我展示了如何启用调试并非常清楚每个属性的作用。
此 Google 搜索结果显示了为此工作所需生成的有效 XML “t:RequestServerVersion”
SoapHeader
在使用课程时,我个人从未设法按照我想要的方式获取标题。为了更加灵活,您也许应该考虑自定义SoapClient
类。正如我在另一个关于 SO 的问题中回答的那样,您可以在覆盖 SOAP 消息时根据您的需要构建 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
必须更改为 prefix 的正确命名空间t
。