Come impostare mustUnderstand attribute soap in php?

ho provato a impostare l' attributo mustUnderstand al mio header xml ma non riesco a risolverlo, ecco il mio frammento di codice,

$actionurl = arrays('Action'=>'www.example.com'); $headers = new SoapHeader('NAMESPACE','Action',$actionurl,true); $client->__setSoapHeaders($headers); $d = $client->__soapCall('MethodName',arrays($params)); 

E la mia richiesta xml, che deve essere abbinata e che voglio dopo aver impostato l'attributo,

 <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">www.example.com</Action> 

quindi sono confuso su questo 'namespace' primo parametro nel metodo soapheader. Che cosa esso e perché usiamo lo stesso? Mi riferivo a questo link e non funzionava affatto. Qualcuno mi può aiutare a get il formato esatto della richiesta xml?

Prima di tutto se vuoi confrontare ciò che crei con il tuo codice rispetto all'XML che hai come esempio da raggiungere, devi avere qualcosa da guardare nell'XML che SoapClient creerà.

È ansible get ciò prendendo in giro il SoapClient :

 /** * Class MockSoapClient */ class MockSoapClient extends SoapClient { /** * @var string|null */ private $lastRequest; public function __doRequest($request, $location, $action, $version, $one_way = 0) { $config = ['input-xml' => 1, 'indent' => 1, 'wrap' => 0, 'indent-attributes' => 1]; $this->lastRequest = tidy_repair_string($request, $config); return ""; } /** * @return string|null */ public function getLastRequest() { return $this->lastRequest; } } 

È ansible sostituire il normale SoapClient con questo nuovo MockSoapClient che è in grado di mostrare la richiesta che sarebbe stata creata da SoapClient .

Facciamo finta una richiesta come la tua:

 $client = new MockSoapClient(null, arrays('location' => "http://localhost/soap.php", 'uri' => "http://test-uri/")); $actionurl = arrays('Action' => 'www.example.com'); $header = new SoapHeader('NAMESPACE', 'Action', $actionurl, true); $client->__soapCall("echoVoid", arrays(), null, $header); 

e vedere come sarebbe la richiesta:

 echo $client->getLastRequest(); 

Ecco l'output:

 <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:ns2="NAMESPACE" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header> <ns2:Action SOAP-ENV:mustUnderstand="1"> <item> <key>Action</key> <value>www.example.com</value> </item> </ns2:Action> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:echoVoid /> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

La parte interessante qui è l'intestazione del soap:

 <SOAP-ENV:Header> <ns2:Action SOAP-ENV:mustUnderstand="1"> <item> <key>Action</key> <value>www.example.com</value> </item> </ns2:Action> </SOAP-ENV:Header> 

Qui " ns2: " è il prefisso dello spazio dei nomi " NAMESPACE " che è quello sbagliato. Nel tuo esempio:

 <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">www.example.com</Action> 

Il namepspace dell'elemento <action> è " http://schemas.microsoft.com/ws/2005/05/addressing/none ". Quindi " NAMESPACE " deve essere sostituito con " http://schemas.microsoft.com/ws/2005/05/addressing/none ".

L'attributo mustUnderstand trova nello spazio dei nomi corretto, quindi va bene. Questo non si sta chiedendo, dato che è uno degli spazi dei nomi standard di Soap, quindi quelli sono predefiniti e non è necessario prestare molta attenzione qui. Solo i loro prefissi differiscono, ma fintanto che i diversi prefissi si riferiscono allo stesso spazio dei nomi, non c'è differenza.

Il terzo punto che è sbagliato è il contenuto dell'elemento <action> , è necessaria solo una string, non il <item><key> / <value> costrutto, a causa della matrix che hai. Proviamo di nuovo:

 $namespace = 'http://schemas.microsoft.com/ws/2005/05/addressing/none'; $actionurl = 'www.example.com'; $header = new SoapHeader($namespace, 'Action', $actionurl, true); 

E ora l'output sembra molto corretto:

 <?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test-uri/" xmlns:ns2="http://schemas.microsoft.com/ws/2005/05/addressing/none" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Header> <ns2:Action SOAP-ENV:mustUnderstand="1">www.example.com</ns2:Action> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:echoVoid /> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Spero che questa risposta ti aiuti a comprendere alcune delle nozioni di base degli spazi dei nomi XML qui e come puoi facilmente eseguire il debug della richiesta di soap che crei qui ispezionando le richieste XML.