как создать запрос на мыло в php из этого xml?

Я устал пытаться отправить запрос с SOAP. это мой xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common" xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common"> <soapenv:Header> <InfoTag xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/BaufestProductivityFramework"> <ClientIp xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">200.125.145.10</ClientIp> <CompanyId xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">1</CompanyId> <UserName xmlns="http://schemas.datacontract.org/2004/07/Bpf.Common.Service">someUser</UserName> </InfoTag> </soapenv:Header> <soapenv:Body> <tem:LogIn> <tem:token> <bpf:type> <bpf1:Description>someDesc</bpf1:Description> <bpf1:Id>1</bpf1:Id> <bpf1:Name>someDesc</bpf1:Name> </bpf:type> <bpf:password>somePass</bpf:password> <bpf:userName>someUser</bpf:userName> </tem:token> </tem:LogIn> </soapenv:Body> </soapenv:Envelope> 

эта функция отправляет заголовок с пространством имен, но их более одного … Я должен отправить их всем?

  private function __getHeaders() { $ns = 'http://schemas.xmlsoap.org/soap/envelope/'; //Namespace of the WS. $ip = $_SERVER['REMOTE_ADDR']; //Body of the Soap Header. $headerbody = array('ClientIp' => $ip, 'CompanyId' => 1, 'UserName' => 'someUser' ); //Create Soap Header. $header = new SOAPHeader($ns, 'InfoTag', $headerbody); return $header; } public function prepareWs(){ $wsdl="the web service"; $client = new SoapClient($wsdl, array('trace' => true)); //Set the Headers of Soap Client. $header = $this->__getHeaders(); $client->__setSoapHeaders($header); 

Я пытаюсь отправить это тело, я проверил исключение с ошибкой мыла, но сообщение возвращает «неправильный запрос NULL NULL NULL».

 $params = new stdClass(); $params = new SoapVar("<tem:token> <bpf:type xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common"> <bpf1:Description xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someDesc</bpf1:Description> <bpf1:Id xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">1</bpf1:Id> <bpf1:Name xmlns:bpf1="http://schemas.datacontract.org/2004/07/Bpf.Security.Authentication.Common">someName</bpf1:Name> </bpf:type> <bpf:password xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">somePass</bpf:password> <bpf:userName xmlns:bpf="http://schemas.datacontract.org/2004/07/Bpf.Security.Common">someUser</bpf:userName> </tem:token>", XSD_ANYXML); $response = $client->Login($params); } 

С CURL я могу отправить этот XML и получить ответ XML тоже, но с SOAPClient я не могу отправить этот запрос.

Надеюсь, кто-то может мне помочь, спасибо.

Это код, который я вижу с помощью firebug, единственное, что я получаю, это «плохой запрос». Когда я использую __getLastRequest (), я вижу то же самое … Думаю, заголовки не должны отправляться правильно, однако функция __setSoapHeaders возвращает true. Это результат:

 <soap-env:envelope xmlns:ns1="http://tempuri.org/" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:header> <soap-env:contextinformation> <item> <key>ClientIp</key> <value>127.0.0.1</value> </item> <item> <key>CompanyId</key> <value>1</value> </item> <item> <key>UserName</key> <value>someUser</value> </item> </soap-env:contextinformation> </soap-env:header> <soap-env:body> <tem:login> <tem:token> <bpf:type> <bpf1:description>someDesc</bpf1:description> <bpf1:id>1</bpf1:id> <bpf1:name>someName</bpf1:name> </bpf:type> <bpf:password>somePass</bpf:password> <bpf:username>someUser</bpf:username> </tem:token> </tem:login> </soap-env:body> </soap-env:envelope> 

SoapHeader обрабатывает массивы довольно произвольно. Если вы когда-либо захотите использовать массив, рассмотрите возможность использования ArrayObject вместо встроенной конструкции .

Однако вам не нужен массив, поскольку вы пытаетесь создать только один элемент в своем заголовке. И поскольку каждый из ваших внутренних элементов (например, ClientIP ) имеет уникальное пространство имен, вы не можете просто передать базовый объект. Вместо этого вам нужно указать конкретное пространство имен для каждого элемента, используя класс SoapVar , который позволяет обернуть обычные данные PHP в контейнер с готовой к SOAP, который SoapClient сможет понять и перевести.

 $innerNS = "http://www.w3.org/BaufestProductivityFramework"; $outerNS = "http://schemas.datacontract.org/2004/07/Bpf.Common.Service"; $tag = new stdClass(); $tag->ClientIP = new SoapVar("200.125.145.10", XSD_STRING, null, null, null, $innerNS); $tag->CompanyId = new SoapVar(1, XSD_INT, null, null, null, $innerNS); $tag->UserName = new SoapVar("someUser", XSD_STRING, null, null, null, $innerNS); $client->__setSoapHeaders(new SoapHeader($outerNS, 'InfoTag', $tag)); 

Наконец, как правило, вручную не записывайте XML! Рассмотрите возможность повторного написания кода вашего SOAP-кода, например, кода заголовка, показанного здесь. Вы должны иметь дело с контентом XML, а не с его структурой.