Вопрос по php, soap – Как определить пространство имен SoapVar?

10

Мне нужно, чтобы этот узел был в моем SOAP-запросе (используется 1.1):

<CredentialsHeader xmlns="http://www.url.com/Services/P24ListingService11"
    <EMail>[email protected]</EMail>
    <Password>password</Password>
</CredentialsHeader>

Так у меня есть следующий PHP:

$client = new SoapClient("https://exdev.www.example.com/Services/example.asmx?WSDL", 
    array(
        "trace"      => 1,
        "exceptions" => 0,
        "cache_wsdl" => 0,
        'soap_version' => SOAP_1_1
        )
);

$CredentialObject = new SoapVar(array('EMail' => '[email protected]', 'Password' => 'password'), SOAP_ENC_OBJECT);

Который генерирует:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.com/Services/Example">
    <SOAP-ENV:Header>
        <ns1:CredentialsHeader>
            <EMail>[email protected]</EMail>
            <Password>password</Password>
        </ns1:CredentialsHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:EchoAuthenticated/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Все, что мне нужно сделать, это предотвратить использованиеns1 и на самом деле определитьxmlns в узле так:

<CredentialsHeader xmlns="http://www.example.com/Services/Example">
        <EMail>[email protected]</EMail>
        <Password>password</Password>
    </CredentialsHeader>

Я проверил это в Firefox Poster и знаю, что изменения решают проблему.

Ваш Ответ

3   ответа
3

http: //www.php.net/manual/tr/soapvar.soapvar.ph

Параметр "node_namespace" - это то, что вы искал

Не могли бы вы написать пример? Я целую вечность пытался заставить этот параметр работать в моем примере, но не могу! rickyduck
0

и я обнаружил, что если вы сопоставляете фиктивный класс с комплексным типом учетных данных из WSDL, PHP выведет что-то вроде:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.com/Services/Example">
    <SOAP-ENV:Header>
        <ns1:CredentialsHeader>
            <ns1:EMail>[email protected]</ns1:EMail>
            <ns1:Password>password</ns1:Password>
        </ns1:CredentialsHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:EchoAuthenticated/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Это не совсем то, что было запрошено, но хотя и более многословно, это эквивалентно.

Код выглядит так:

$client = new SoapClient("https://exdev.www.example.com/Services/example.asmx?WSDL", 
    array(
        "trace"         => 1,
        "exceptions"    => 0,
        "cache_wsdl"    => 0,
        "soap_version"  => SOAP_1_1,
        "classmap"      => array(
            'credential_complex_type'   => 'CredentialObject',
        ),
    )
);

class CredentialObject {}

$credentialObject = new CredentialObject();
$credentialObject->Email = '[email protected]';
$credentialObject->Password = 'password';
10
$CredentialObjectXML  = '<CredentialsHeader xmlns="http://www.example.com/Services/Example">
        <EMail>'.$UserName.'</EMail>
        <Password>'.$Password.'</Password>
    </CredentialsHeader>';


$CredentialObject  = new SoapVar($CredentialObjectXML,XSD_ANYXML);

Надеюсь, это решит твою проблему.

Не самая красивая, но это сработало! Спасиб rickyduck

Похожие вопросы