Установите заголовок xml rquest в мыльном клиенте не-wsdl, используя переполнение стека

Я пытаюсь сделать не-wsdl клиентский вызов SOAP с использованием php. Мой код примерно такой:

try {
$URL = 'http://example.com/webservices/security/accesscontrol.asmx';

$sc = new SoapClient(null, array(
'location' => $URL,
'uri' => 'http://example.com/webservices/security/',
'trace' => 1
));

$usertoken = array('UserNameToken' =>
array(
'UserName' => 'test',
'Password' => 'test123'
));

$header = new SoapHeader('http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'Security', $usertoken);

$sc->__setSoapHeaders($header);

$test = $sc->__soapCall("AuthenticateClient",
array(),
array('soapaction' => 'http://example.com/webservices/security/AuthenticateClient')
);

Если я отлаживаю и вижу часть заголовка Last request в xml, это выглядит так:

<SOAP-ENV:Header>
<ns2:Security>
<item><key>UserNameToken</key><value><item><key>UserName</key><value>test</value></item><item><key>Password</key><value>test123</value></item></value></item>
</ns2:Security>
</SOAP-ENV:Header>

Но если я использую файл wsdl, заголовок xml выглядит так:

<SOAP-ENV:Header>
<ns2:Security>
<ns2:UserNameToken>
<ns2:UserName>test</ns2:UserName>
<ns2:Password>test123</ns2:Password>
</ns2:UserNameToken>
</ns2:Security>
</SOAP-ENV:Header>

Как я могу сделать часть заголовка, как описано выше, используя не-wsdl клиентский вызов SOAP? Так как он не работает и выдает ошибку, вызванную тем, что «если в запросе заголовка мыла AuthenticateClient не указан токен имени пользователя или имя пользователя»

Заранее спасибо за помощь.

Обратите внимание, что я изменил URL и пароль намеренно, так как не могу их разглашать.

1

Решение

Вы можете создать часть заголовка вручную и вставить ее в SoapHeader, попробуйте сделать что-то вроде этого:

    $URL = 'http://example.com/webservices/security/accesscontrol.asmx';

$soapClient = new SoapClient(null, array(
'location' => $URL,
'uri' => 'http://example.com/webservices/security/',
'trace' => 1
));

$headerPart = '
<SOAP-ENV:Header>
<ns2:Security>
<ns2:UserNameToken>
<ns2:UserName>DASKO</ns2:UserName>
<ns2:Password>welcome1</ns2:Password>
</ns2:UserNameToken>
</ns2:Security>
</SOAP-ENV:Header>
';

$soapVarHeader = new SoapVar($headerPart, XSD_ANYXML, null, null, null);

$header = new SoapHeader(
'http://www.docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', // Namespace - namespace of the WebService
'Security',
$soapVarHeader,
false // mustunderstand
);

$soapClient->__setSoapHeaders($header);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]