2012-06-01 21 views
10

tengo que tener este nodo en mi solicitud SOAP (usando 1.1):¿Cómo se define un espacio de nombres SoapVar?

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

Así que tienen la siguiente 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); 

que genera:

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

Todo lo lo que hay que hacer es evitarlo usando ns1 y realmente definir el xmlns en el nodo como lo siguiente:

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

Lo he probado en Firefox Poster y sé con certeza que el cambio soluciona el problema.

Respuesta

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


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

De esta manera puede usar directamente el XML con el tipo XSD_ANYXML.

Espero que esto resuelva su problema.

+0

¡No es el más bonito, pero funcionó! Gracias – rickyduck

0

que tenían el mismo problema y descubrió que si asigna una clase ficticia para el tipo complejo de credenciales de su WSDL, PHP sería algo así como:

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

Esto no es exactamente lo que se solicitó, pero a pesar de más detallado, es equivalente.

El código dice así:

$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'; 
Cuestiones relacionadas