Я попытался установить атрибут 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-запросы.