Вопрос по php, request, xml, soap – как сгенерировать запрос мыла в php из этого xml?

4

Я устал от попыток отправить запрос с помощью 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>
Вместо того, чтобы гадать, я предлагаю вам начать отладку вашей проблемы, включив режим трассировки запроса в SoapClient и выяснив, какой XML он генерирует:php.net/manual/soapclient.getlastrequest.php hakre

Ваш Ответ

1   ответ
2

SoapHeader относится к массивам довольно произвольно. Если вы хотите использовать массив, подумайте об использованииArrayObject instead of the native construct.

Однако вам вообще не нужен массив, поскольку вы пытаетесь создать только один элемент в своем заголовке. И потому, что каждый из ваших внутренних элементов (например.ClientIP) имеет уникальное пространство имен, вы не можете просто передать базовый объект. Вместо этого вы должны указать конкретное пространство имен для каждого элемента, используяSoapVar класс, который позволяет вам обернуть обычные данные PHP в «SOAP-ready» контейнер, который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));

Наконец, как правило,don't manually write XML!  Попробуйте переписать ваш код тела SOAP, как показано в коде заголовка, показанном здесь. Вы должны быть в состоянии иметь дело конкретно сcontent XML, а не его структура.

Я добился того, чтобы он работал, но мне пришлось переопределить метод doRequest и манипулировать DOMDocument, чтобы сделать запрос идентичным исходному xml. Можете ли вы помочь мне с запросом тела? Мне действительно интересно, чтобы все работало правильно. Теперь работает, но .. писать XML в soapVar ... Очень ценю вашу помощь! Спасибо за помощь мне! BruneX
Schema-instance пространство имен, похоже, нигде не используется в запросе, поэтому я ожидаю, что его можно будет опустить.
Спасибо, я постараюсь ... но если вы увидите это более подробно, & quot; InfoTag & quot; имеет 2 пространства имен xmlns: i = & quot;w3.org/2001/XMLSchema-instance& Quot; и xmlns = & quot;w3.org/BaufestProductivityFramework& Quot; это не влияет на мою просьбу? BruneX

Похожие вопросы