我需要使用SoapHeader()调用将此.NET语法转换为PHP。
esb.RequestServerVersionValue = new RequestServerVersion(); esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
非常感谢! :)
答案 0 :(得分:1)
$soapHeader = new SoapHeader(
'http://schemas.microsoft.com/exchange/services/2006/types',
'RequestServerVersion Version="Exchange2007_SP1"'
);
$客户端 - > __ setSoapHeaders($ SOAPHEADER);
这基本上都是真正需要设置的。我对命名空间设置感到困惑。奇怪的是,使用公用文件夹时需要RequestServerVersion标头,但在Exchange 2007中使用邮箱项时似乎不需要。
此链接特别有用:http://www.zimbra.com/forums/developers/5532-php-soap-vs-zimbra.html因为它向我展示了如何启用调试并清楚地说明了每个属性的作用。
此Google搜索结果显示生成此代码所需的有效XML“t:RequestServerVersion”
答案 1 :(得分:0)
在使用SoapHeader
类时,我个人从未设法按照我想要的方式获取标题。为了更灵活,您应该考虑自定义SoapClient
类。正如我在another question中回答的那样,您可以在覆盖SoapClient::__doRequest()
时根据需要构建SOAP消息。这样你就可以随意插入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
的正确名称空间。