Этот вопрос относится к использованию SoapParam и SoapVar в клиенте PHP SOAP для обработки повторяющихся элементов, когда запросы не могут быть оформлены как ассоциативные массивы.В частности, он решает проблему использования SoapParam / SoapVar для сложных элементов.
У меня есть рабочий код, который я пытаюсь изменить, чтобы разрешить повторный элемент в запросе SOAP.
Рабочийкод выглядит следующим образом и корректно возвращает сведения об одном consignmentID.
$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);
Теперь мне нужно иметь возможность передавать несколько consignmentIds, и, очевидно, ассоциативный массив для этого не подойдет.Поэтому я пытался использовать SoapParam и SoapVar;Кстати, я не нашел много документации или примеров для них.
Я пробовал следующее:
$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);
Это дает: SOAP-ERROR: Кодировка: объект не имеет заголовка'property.
Я также пытался использовать SoapVar в надежде форсировать сложный тип' header 'следующим образом:
$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);
Это также дает: SOAP-ERROR: Encoding: objectне имеет свойства 'header'.
Я также пробовал варианты в последней строке кода, такие как:
$request = array('parameters' => $parameters);
$request = array($parameters);
$request = $parameters;
В качестве эксперимента я временно назначил строку для $ header, а затемсмог посмотреть XML, сгенерированный __soapCall до вызова __doRequest, и обнаружил, что он содержит следующее:
<SOAPENV:Body><ns1:getConsignmentDetailRequest/>
<consignmentId>PDH44109</consignmentId><consignmentId>PDH44110</consignmentId>
</SOAP-ENV:Body>
Вы видите, что несколько партий были правильно включены - эта часть кажется решенной- но заголовок (сложный тип) полностью опущен.
Буду очень признателен за любую помощь!Я настоящий новичок и потратил на это больше суток.Я совершенно не уверен, например, в SoapVar, каковы соответствующие параметры.
Возможно, есть проблема с вводом 'header'?Ниже предоставлены некоторые выдержки из wsdl для справки.
------
<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>
------