Как я могу создать заголовок мыла, как это? - PullRequest
3 голосов
/ 27 марта 2009

Выполнение некоторых вызовов SOAP для сторонних приложений. Они предоставляют этот заголовок мыла как пример того, что ожидает приложение. Как я могу создать заголовок SOAP, как это в PHP?

<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>

1 Ответ

3 голосов
/ 27 марта 2009

Обработка заголовка SOAP в PHP на самом деле не очень гибкая, и я бы сказал, что использование двух пространств имен в заголовке сделает невозможным внедрение заголовка, просто используя SoapHeader -конструктуру некоторого типа.

Я думаю, что лучший способ справиться с этим - сформировать XML-запрос самостоятельно, переопределив SoapClient::__doRequest() в пользовательском классе, который расширяет SoapClient.

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 для получения дополнительной информации и некоторых примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...