Karmaşık türü için PHP SoapParam / SoapVar "nesne değil 'xxx' özelliğine sahiptir" verir

0 Cevap php

Bu soru, açılış birleştirici çerçeveli dizileri olarak edilemez tekrar elemanları, işlemek için bir PHP SOAP istemci SoapParam ve SoapVar kullanımına ilişkindir. Daha özel olarak, karmaşık elemanları SoapParam / SoapVar kullanarak bir zorluk giderir.

Ben soap isteği bir tekrarlanan eleman sağlamak için değiştirmeye çalışıyorum kod çalışma var.

Çalışma kodu aşağıdaki gibidir ve doğru tek bir consignmentID ayrıntılarını verir.

$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);

Ben artık birden consignmentIds geçmek ve belli bir ilişkisel dizi olduğu için işe yaramaz gerekiyor. Yani SoapParam ve SoapVar kullanmaya çalışıyorlar; yoluyla bu belgelerine veya bir çok örnek bulmak değil.

Ben aşağıdakileri denedim:

$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);

Bu verir: SABUN-HATA: Kodlama: nesne değil 'başlığı' özelliğine sahiptir.

Aşağıdaki gibi ben de, 'başlığının' karmaşık türünü zorlamak umuduyla SoapVar kullanarak denedi:

$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);

Bu aynı zamanda verir: SOAP-HATA: Kodlama: nesne değil 'başlığı' özelliğine sahiptir.

Ben de gibi kod son satırında varyasyonlar denedi:

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

Bir deneme olarak ben geçici $ başlığına bir dize atanmış ve bilahare __ doRequest çağırmadan __ soapCall tarafından oluşturulan XML gözetleme başardı ve şu içerdiği bulundu:

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

Sen birden konşimentoları doğru dahil edildiğini görebilirsiniz - o kısmı çözülecek gibi görünüyor - ama 'başlığı' (karmaşık bir tip) tamamen ihmal edilir.

Çok herhangi bir yardım takdir ediyorum ne olursa olsun! Ben gerçek bir acemi ve bu konuda fazla bir gün geçirdim. SoapVar oldukça belirsiz duyuyorum, örneğin, uygun parametreleri nelerdir.

Belki 'başlığı' yazılırken bir sorun var mı? Referans için aşağıda bazı Wsdl özleri sağladı.

------

<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>

------

0 Cevap