对第三方应用程序进行一些SOAP调用。它们提供此soap标头作为应用程序所期望的示例。如何在PHP中创建这样的SOAP头?
<SOAP-ENV:Header>
<NS1:Security xsi:type="NS2:Security" xmlns:NS1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:NS2="urn:dkWSValueObjects">
<NS2:UsernameToken xsi:type="NS2:TUsernameToken">
<Username xsi:type="xsd:string">XXXX</Username>
<Password xsi:type="xsd:string">XXX</Password>
</NS2:UsernameToken>
</NS1:Security>
</SOAP-ENV:Header>
我认为我认为这是一个正确的电话,并继续得到没有发送标题的信息。
以下是我的代码中的示例。
class SOAPStruct
{
function __construct($user, $pass)
{
$this->Username = $user;
$this->Password = $pass;
}
}
$client = new SoapClient("http://www.example.com/service");
$auth = new SOAPStruct("username", "password");
$header = new SoapHeader("http://example.com/service", "TUsernameToken", $auth);
$client->__setSoapHeaders(array($header));
$client->__soapCall("GetSubscriptionGroupTypes", array(), NULL, $header)
这是我回来的SOAP标题。 (它更多,但我删除了可能敏感的信息)
<SOAP-ENV:Header>
<ns2:TUsernameToken>
<Username>username</Username>
<Password>password</Password>
</ns2:TUsernameToken>
</SOAP-ENV:Header>
答案 0 :(得分:3)
PHP中的SOAP标头处理实际上不是很灵活,我甚至会说,特别是在标头中使用两个名称空间将使得仅使用SoapHeader
- 构造无法注入标头某种类型。
我认为处理这个问题的最佳方法是通过在SoapClient::__doRequest()
扩展的自定义类中覆盖SoapClient
来自行调整XML请求。
class My_SoapClient extends SoapClient
{
public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
$xmlRequest = new DOMDocument('1.0');
$xmlRequest->loadXML($request);
/*
* Do your processing using DOM
* e.g. insert security header and so on
*/
$request = $xmlRequest->saveXML();
return parent::__doRequest($request, $location, $action, $version, $one_way);
}
}
请参阅SoapClient::__doRequest
了解更多信息和一些示例。