2012-06-01 14 views
10

Ich brauche diesen Knoten in meiner SOAP-Anforderung haben (mit 1.1):So definieren Sie einen SoapVar-Namespace?

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

So habe ich die folgende 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); 

Welche erzeugt:

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

Alles, was ich zu tun ist, es zu verhindern mit ns1 und tatsächlich definieren die xmlns in dem Knoten wie folgt:

Ich habe das in Firefox Poster getestet und weiß für eine Tatsache, dass die Änderung das Problem behebt.

Antwort

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


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

Auf diese Weise können Sie direkt das XML mit Type XSD_ANYXML verwenden.

Hoffe das wird Ihr Problem lösen.

+0

Nicht das schönste, aber es hat funktioniert! Vielen Dank – rickyduck

0

Ich hatte das gleiche Problem und fand heraus, dass, wenn Sie eine Dummy-Klasse auf die Berechtigung komplexen Typen von Ihrem WSDL Karte, wird PHP Ausgabe so etwas wie:

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

Das ist nicht genau das, was angefordert wurde, aber obwohl Ausführlicher, es ist äquivalent.

Der Code lautet:

$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'; 
Verwandte Themen