Проблема в PHP и методе SOAP-Client Call двух параметров и одного ArrayMultidimensional - PullRequest
0 голосов
/ 14 июня 2019

У меня проблема с вызовом метода WebServer, для которого требуются три параметра типа String, а другой - подэлемент, имеющий еще три параметра.Я передаю все как многомерный массив, но он не работает.В структуре, отправляемой веб-серверу SOAPClient, он не добавляет массив с несколькими адресами, он сохраняет только первые два параметра.

КОД PHP EXAMPLE SOAP:


$ws = new \SoapClient($this->getWSUrl()
                ,[
                'trace'=>true,
                'soap_version'=>SOAP_1_2,
                'encoding'=>'utf-8',
                'connection_timeout'=>'10',
                'cache_wsdl'=> WSDL_CACHE_NONE,
                ]);

$parameters = array(
    'token' => 'xxxxxx',
    'usuario' => 'xxxxxxx',
    'archivo' => array(
        'fileType' => 'text/xml​',
        'nombre' => 'test.xml',
        'xml' => 'PD94bW..xxxxxxxxxx.0dWQ+'
    )
);

$ws->MyFunctionInWebServer($parameters);

echo $ws->__getLastRequest();

XML, сгенерированный SOAP, является следующим, и это неверно, поскольку он не имеет элемента "archivo"

OUT Запрос SOAP:


<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
 <env:Body>
  <ns1:enviarSolicitud>
   <token>xxxxxxxx</token>
   <usuario>xxxxxx</usuario>
  </ns1:enviarSolicitud>
 </env:Body>
</env:Envelope>

Когда запрос должен быть:


<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://xxxxxxxxxxx.xxx/">
 <env:Body>
  <ns1:enviarSolicitud>
   <token>xxxxxxxx</token>
   <usuario>xxxxxx</usuario>
   <archivo>
     <fileType>text/xml​</fileType>
     <nombre>test_21.xml</nombre>
     <xml>PD94xxxxxx0dWQ+</xml>
   </archivo>
  </ns1:enviarSolicitud>
 </env:Body>
</env:Envelope>

Вы можете передать этот тип с помощью SOAPClient .. ???

1 Ответ

0 голосов
/ 14 июня 2019

Мое решение - использовать SoapVar () в $ parametersArray и допустимо для строки XML BaseEncode64:

$ws = new \SoapClient($this->getWSUrl()
                , [
                    //'trace' => true,
                    'encoding' => 'utf-8',
                    'connection_timeout' => '10',
                    'cache_wsdl' => WSDL_CACHE_MEMORY,
                ]);

            $parm = array();
            $subparm = array();

            $parm[] = new SoapVar($parametersArray['token'], XSD_STRING, null, null, 'token');
            $parm[] = new SoapVar($parametersArray['usuario'], XSD_STRING, null, null, 'usuario');
            $subparm[] = new SoapVar($parametersArray['archivo']['fileType'], XSD_STRING, null, null, 'fileType');
            $subparm[] = new SoapVar($parametersArray['archivo']['nombre'], XSD_STRING, null, null, 'nombre');
            $subparm[] = new SoapVar($parametersArray['archivo']['xml'], XSD_STRING, null, null, 'xml');
            $parm[] = new SoapVar($subparm, SOAP_ENC_OBJECT, null, null, 'archivo');
            $resp = new SoapVar($parm, SOAP_ENC_OBJECT);

            $data = json_decode(json_encode($ws->generarSolicitud($resp)->return), true);

            //exit(debug($ws->__getLastRequest()));

Альтернатива легкая, недопустима для моего dataArray в «xml», изменить stringBaseCode64; - (

$ws = new \SoapClient($this->getWSUrl()
                , [
                    //'trace' => true,
                    'encoding' => 'utf-8',
                    'connection_timeout' => '10',
                    'cache_wsdl' => WSDL_CACHE_MEMORY,
                ]);

$data = json_decode(json_encode($ws->generarSolicitud($parametersArray)->return), true);

//exit(debug($ws->__getLastRequest()));
...