Pregunta

He siguiente código:

$telnums = array(10, 20, 30);
$obj = new StdClass();
$obj->telnums = new StdClass();
foreach ($telnums as $telnum) {
    $obj->telnums = $telnum;
}

call_user_func(array($this->client, 'createDomain'), new SoapVar($obj, SOAP_ENC_OBJECT));

$ this-> cliente es una instancia de la clase SoapClient.

Y genera petición siguiente:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="...">
    <SOAP-ENV:Body>
        <ns1:createDomain>
            <createDomainRequest>
                <telnums>30</telnums>
            </createDomainRequest>
        </ns1:createDomain>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Pero necesito

            <createDomainRequest>
                <telnums>10</telnums>
                <telnums>20</telnums>
                <telnums>30</telnums>
            </createDomainRequest>

¿Cómo puedo lograr esto?

P.S .: PHP 5.2.6-3ubuntu4.5 con Suhosin-Patch 0.9.6.2 (CLI) (construyó el 6 enero 2010 22:25:33)

Gracias de antemano!

¿Fue útil?

Solución 5

fija por extiende SoapClient y anulaciones __doRequest () método en el que modifico petición según lo expuesto aquí: http://www.php.net/manual/en/soapclient.dorequest.php#57995

ve terrible para mí, pero funciona "aquí y ahora".

Otros consejos

Me había aterrizado en un escenario similar hace poco y me encontré con este patrón por lo general hace el truco.

$obj = new StdClass();
foreach ($telnums as $telnum) {
    $obj->telnums[] = $telnum;
}

La razón por la que esto funciona es porque emula la misma estructura de datos según lo prescrito por su WSDL

La respuesta correcta debería haber sido:

$options = array(
  'createDomainRequest' => array(
    'telnums' => array(
      '10',
      '20',
      '30'
    )
  )
);

:)

Es un dolor en la nalga para encontrar una solución de trabajo, pero al final no es tan difícil. Incluso sorprendentemente fácil y ordenada mediante el uso de SoapParam:

$soapClient = new SoapClient($wsdl);
$soapClient->__call('createDomain', array(
    new SoapParam('10', 'telnums'),
    new SoapParam('20', 'telnums'),
    new SoapParam('30', 'telnums'),
));

Aquí está el formato de código que he utilizado:

$wsdl = 'https://your.api/path?wsdl';
$client = new SoapClient($wsdl);
$multipleSearchValues = [1, 2, 3, 4];
$queryData = ['yourFieldName' => $multipleSearchValues];
$results = $client->YourApiMethod($queryData);
print_r($results);
$telnums=array(10, 20, 30);
$createDomainRequest=array('createDomainRequest' => array(
  'telnums' => $telnums)
);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top