2011-01-12 10 views
5

Esta pregunta se relaciona con el uso de SoapParam y SoapVar en un cliente PHP SOAP para manejar elementos repetitivos, donde las solicitudes no se pueden enmarcar como matrices asociativas. Más particularmente, aborda una dificultad en el uso de SoapParam/SoapVar para elementos complejos.PHP SoapParam/SoapVar para tipo complejo da "objeto no tiene 'xxx' propiedad" - elemento repetitivo

Tengo código de trabajo que estoy tratando de modificar para permitir un elemento repetido en la solicitud SOAP.

El código de trabajo es el siguiente y devuelve correctamente los detalles de un único consignatario.

$oClient = new SoapClient($wsdlFilespec, $arguments); 
$parameters = array(
    'header' => array(
     'source' => $_POST['source'], 
     'accountNo' => $_POST['accountNo'], 
     'userAccessKey' => $connection['userAccessKey'] 
    ), 
    'consignmentId' => $_POST['consignmentId'] 
    ); 
$request = array('parameters' => $parameters); 
$result = $oClient->__soapCall($operation, $request); 

ahora tengo que ser capaz de pasar en múltiples consignmentIds y, obviamente, una matriz asociativa no funcionará para eso. Así que he estado tratando de usar SoapParam y SoapVar; no encontrando mucha documentación o ejemplos para estos por cierto.

He intentado lo siguiente:

$header = array(
    new SoapParam((string)$_POST['source'], 'source'), 
    new SoapParam((int)$_POST['accountNo'], 'accountNo'), 
    new SoapParam((string)$connection['userAccessKey'], 'userAccessKey') 
); 

$parameters = array(
    new SoapParam($header, 'header'), 
    new SoapParam((string)'PDH44109', 'consignmentId'), 
    new SoapParam((string)'PDH44110', 'consignmentId') 
    ); 
$request = array('parameters' => $parameters); 

Esto da: Jabón-ERROR: Codificación: no objeto tiene la propiedad 'cabecera'.

También he intentado usar SoapVar con la esperanza de forzar el complejo de tipo de 'cabecera', de la siguiente manera:

$header = array(
    new SoapParam((string)$_POST['source'], 'source'), 
    new SoapParam((int)$_POST['accountNo'], 'accountNo'), 
    new SoapParam((string)$connection['userAccessKey'], 'userAccessKey') 
); 
$headerVar = new SoapVar($header, SOAP_ENC_OBJECT, 'TransactionHeaderType',  
"http://myexpress/Common/actions/externals/Consignment/v1"); 

$parameters = array(
      new SoapParam($headerVar, 'header'), 
    new SoapParam((string)'PDH44109', 'consignmentId'), 
    new SoapParam((string)'PDH44110', 'consignmentId') 
    ); 
$request = array('parameters' => $parameters); 

Esto también da: Jabón-ERROR: Codificación: no objeto tiene la propiedad 'cabecera' .

también he intentado variaciones en la última línea de código como:

$request = array('parameters' => $parameters); 
$request = array($parameters); 
$request = $parameters; 

Como experimento he asignado temporalmente una cadena a $ cabecera y luego fue capaz de echar un vistazo al XML generado por __soapCall antes llamando __doRequest y se encontró que contenía lo siguiente:

<SOAPENV:Body><ns1:getConsignmentDetailRequest/> 
<consignmentId>PDH44109</consignmentId><consignmentId>PDH44110</consignmentId> 
</SOAP-ENV:Body> 

se puede ver que los múltiples envíos se han incluido correctamente - esa parte parece que hay que resolver - pero 'cabecera' (un tipo complejo) se omite por completo .

¡Cuánto agradecería cualquier ayuda! Soy un verdadero principiante y he pasado más de un día en esto. Soy bastante incierto con SoapVar, por ejemplo, cuáles son los parámetros apropiados.

¿Quizás hay un problema con el tipeo de 'encabezado'? He proporcionado algunos extractos wsdl a continuación para referencia.

------ 

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://my.com.au/ESB/Services/Concrete/External/Services/v1" 

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns0="http://myexpress/Common/actions/externals/Consignment/v1" 

xmlns:ns1="http://myexpress/Common/externals/Faultv1" xmlns:ns2="http://myexpress/Common/actions/externals/FreightCalculation/v1" 

xmlns:ns3="http://myexpress/Common/Primitives/v1" xmlns:ns4="http://myexpress/Common/FreightProcessing/v1" 

xmlns:ns5="http://myexpress/Common/Account/v1" xmlns:ns6="http://myexpress/Common/Imaging/v1" name="Untitled" 

targetNamespace="http://my.com.au/ESB/Services/Concrete/External/Services/v1"> 

------ 

     <xsd:schema xmlns="http://myexpress/Common/Primitives/v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

xmlns:acc="http://myexpress/Common/Account/v1" targetNamespace="http://myexpress/Common/Primitives/v1" elementFormDefault="qualified" 

attributeFormDefault="unqualified"> 
      <xsd:import namespace="http://myexpress/Common/Account/v1"/> 
    . 
    . 
    . 
    . 

      <xsd:complexType name="TransactionHeaderType"> 
       <xsd:sequence> 
        <xsd:element name="source" type="xsd:string"/> 
        <xsd:element name="accountNo" type="xsd:integer"/> 
        <xsd:element name="userAccessKey" type="xsd:string"/> 
        <xsd:element name="userId" type="ns3:userIdType" minOccurs="0"/> 
        <xsd:element name="transactionId" type="ns3:transactionIdType" minOccurs="0"/> 
        <xsd:element name="transactionDatetime" type="xsd:dateTime" minOccurs="0"/> 
       </xsd:sequence> 
      </xsd:complexType> 

------ 

      <xsd:simpleType name="consignmentIdType"> 
       <xsd:restriction base="xsd:string"> 
        <xsd:maxLength value="30"/> 
       </xsd:restriction> 
      </xsd:simpleType> 

------ 

      <xsd:element name="getConsignmentDetailRequest"> 
       <xsd:complexType> 
        <xsd:sequence> 
         <xsd:element name="header" type="prim:TransactionHeaderType"/> 
         <xsd:element name="consignmentId" type="ns0:consignmentIdType" maxOccurs="unbounded"/> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 

------ 

Respuesta

8

tras golear por ahí con SoapVar y SoapParam por días y llegar a ninguna parte, piensan que la solución simple:

$oClient = new SoapClient($wsdlFilespec, $arguments); 
$parameters = array(
        'header' => array(
             'source' => $_POST['source'], 
             'accountNo' => $_POST['accountNo'], 
             'userAccessKey' => $connection['userAccessKey'] 
            ), 
        'consignmentId' => array('PDH44109', 'PDH44110') 
        ); 
$request = array('parameters' => $parameters); 
$result = $oClient->__soapCall($operation, $request); 
Cuestiones relacionadas