Comment définir un espace de noms SoapVar?

j'ai besoin d'avoir ce nœud dans ma Requête SOAP (à l'aide d'1.1):

<CredentialsHeader xmlns="http://www.url.com/Services/P24ListingService11"
    <EMail>ricky@email.net</EMail>
    <Password>password</Password>
</CredentialsHeader>

j'ai Donc le PHP suivant:

$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' => 'ricky@email.net', 'Password' => 'password'), SOAP_ENC_OBJECT);

Qui génère:

<?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>ricky@email.net</EMail>
            <Password>password</Password>
        </ns1:CredentialsHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:EchoAuthenticated/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Tout ce que j'ai à faire est de prévenir à l'aide de ns1 et en fait de définir l' xmlns dans le nœud de la sorte:

<CredentialsHeader xmlns="http://www.example.com/Services/Example">
        <EMail>ricky@email.net</EMail>
        <Password>password</Password>
    </CredentialsHeader>

j'ai testé cela dans L'affiche de Firefox et je sais pour un fait que le changement corrige le problème.

10
demandé sur hakre 2012-06-01 14:05:05

3 réponses

$CredentialObjectXML  = '<CredentialsHeader xmlns="http://www.example.com/Services/Example">
        <EMail>'.$UserName.'</EMail>
        <Password>'.$Password.'</Password>
    </CredentialsHeader>';


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

de cette façon, vous pouvez utiliser directement le XML avec le Type XSD_ANYXML.

J'espère que cela résoudra votre problème.

10
répondu Umesh Chavan 2012-06-07 18:36:40

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

Paramètre "node_namespace" est-ce que vous avez été à la recherche pour, je suppose.

3
répondu gokturk 2012-06-06 12:15:07

j'ai eu le même problème et j'ai découvert que si vous mappez une classe fictive au type de complexe de justificatifs d'identité de votre WSDL, PHP affichera quelque chose comme:

<?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>ricky@email.net</ns1:EMail>
            <ns1:Password>password</ns1:Password>
        </ns1:CredentialsHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:EchoAuthenticated/>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

ce n'est pas exactement ce qui a été demandé mais bien que plus verbeux, il est équivalent.

le code va comme ceci:

$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 = 'ricky@email.net';
$credentialObject->Password = 'password';
0
répondu Bao-Long Nguyen-Trong 2013-01-22 22:57:15