Как установить мыло атрибута mustUnderstand в php?

Я попытался установить атрибут mustUnderstand в свой заголовок xml, но не смог его отсортировать, вот мой фрагмент кода,

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

И мой запрос xml, который нужно сопоставить и который я хочу после настройки атрибута,

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

так что я запутался в этом первом параметре пространства имен в soapheader method.What это он и почему мы используем то же самое? Ссылался на эту ссылку, и она вообще не работала. Может ли кто-нибудь помочь мне получить этот точный формат XML-запроса?

Прежде всего, если вы хотите сравнить то, что вы создаете с вашим кодом, против XML, который у вас есть в качестве примера для таргетинга, вам нужно что-то посмотреть в XML, созданный SoapClient .

Вы можете добиться этого, издеваясь над 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; } } 

Вы можете заменить обычный SoapClient этим новым MockSoapClient, который может показать запрос, который был создан SoapClient .

Давайте подделываем такой запрос, как ваш:

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

и посмотреть, как будет выглядеть запрос:

 echo $client->getLastRequest(); 

Здесь вывод:

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

Интересная часть здесь – заголовок мыла:

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

Здесь « ns2: » является префиксом NAMESPACE имен « NAMESPACE », которое является неправильным. В вашем примере:

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

Пространство имен элемента <action> : « http://schemas.microsoft.com/ws/2005/05/addressing/none ». Поэтому « NAMESPACE » необходимо заменить на « http://schemas.microsoft.com/ws/2005/05/addressing/none ».

Атрибут mustUnderstand находится в правильном пространстве имен, так что это нормально. Это не интересно, так как это одно из стандартных пространств имен Soap, поэтому они предопределены, и вам не нужно здесь заботиться. Только их префиксы отличаются друг от друга, но пока разные префиксы относятся к одному и тому же пространству имен, нет никакой разницы.

Третий момент, который является неправильным, – это содержимое элемента <action> , вам нужна только строка, а не конструкция <item><key> / <value> которая из-за вашего массива. Попробуем еще раз:

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

И теперь результат выглядит очень корректно:

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

Я надеюсь, что этот ответ поможет вам понять некоторые основы пространств имен XML здесь, а также то, как вы можете более легко отлаживать созданный здесь мыльный запрос, проверив XML-запросы.