1

PHPのsoapが複合型の配列を処理しないことを発見した後、私はstdClass()を使用しています。何かをコーディングしましたが、soapリクエストが間違った順序で作成されます。idtagとidtaginfoを次のようにペアにします。

     <soap:Body>
     <ns:sendLocalListRequest>
     <ns:updateType>full</ns:updateType>
     <ns:listVersion>1</ns:listVersion>

     <ns:localAuthorisationList>

           <ns:idTag>1</ns:idTag>
                   <ns:idTagInfo>
                      <ns:status>good</ns:status>
                    </ns:idTagInfo>

            <ns:idTag>2</ns:idTag>
                   <ns:idTagInfo>
           <ns:status>bad</ns:status>
                    </ns:idTagInfo>

     </ns:localAuthorisationList>

  </ns:sendLocalListRequest>
   </soap:Body>

間違っている私の石鹸リクエストは以下のように出てきます

  <env:Body><ns1:sendLocalListRequest><ns1:updateType>FULL</ns1:updateType>
  <ns1:listVersion>1</ns1:listVersion>

  <ns1:localAuthorisationList>
  <ns1:idTag>1</ns1:idTag><ns1:idTag>2</ns1:idTag>

 <ns1:idTagInfo><ns1:status>good</ns1:status><ns1:status>bad</ns1:status>
  </ns1:idTagInfo>
   </ns1:localAuthorisationList></ns1:sendLocalListRequest></env:Body>

これはwsdlの関連部分です

 <s:complexType name="SendLocalListRequest">
    <s:annotation>
      <s:documentation>Defines the SendLocalList.req PDU</s:documentation>
    </s:annotation>
    <s:sequence>
      <s:element name="updateType" type="tns:UpdateType" minOccurs="1" maxOccurs="1" />
      <s:element name="listVersion" type="s:int" minOccurs="1" maxOccurs="1" />
      <s:element name="localAuthorisationList" type="tns:AuthorisationData"
       minOccurs="1" maxOccurs="unbounded" />
      <s:element name="hash" type="s:string" minOccurs="0" maxOccurs="1" />
    </s:sequence>
  </s:complexType>

    <s:complexType name="AuthorisationData">
          <s:sequence>
       <s:element name="idTag" type="tns:string" minOccurs="1" maxOccurs="unbounded"/>
      <s:element name="idTagInfo" type="tns:IdTagInfo" minOccurs="1"
     maxOccurs="unbounded"/>
            </s:sequence>
                 </s:complexType>

  <s:simpleType name="UpdateType">
    <s:restriction base="s:string">
      <s:enumeration value="Differential"/>
      <s:enumeration value="Full"/>
    </s:restriction>
  </s:simpleType>

 <s:complexType name="SendLocalListResponse">
    <s:annotation>
      <s:documentation>Defines the SendLocalList.conf PDU</s:documentation>
    </s:annotation>
    <s:sequence>
      <s:element name="status" type="tns:UpdateStatus" minOccurs="1" maxOccurs="1" />
      <s:element name="hash" type="s:string" minOccurs="0" maxOccurs="1" />
    </s:sequence>
  </s:complexType>

 <s:complexType name="IdTagInfo">
    <s:sequence>
      <s:element name="status" type="s:string" minOccurs="1" maxOccurs="unbounded" />
      <s:element name="expiryDate" type="s:dateTime" minOccurs="0" maxOccurs="1"/>
      <s:element name="parentIdTag" type="tns:IdToken" minOccurs="0" maxOccurs="1"/>
    </s:sequence>
  </s:complexType>

これは私のコードです

$search_query = new StdClass();
$search_query->updateType = $updatetype;
$search_query->listVersion = $listversion;

 $search_query->localAuthorisationList = new StdClass();

 while ($row = $db->getResult()) {


 $search_query->localAuthorisationList->idTag[] = $row['rfid'];

 $search_query->localAuthorisationList->idTagInfo->status[] = $row['status'];

 }


   ini_set("soap.wsdl_cache_enabled", "0"); 

$path        = realpath($_SERVER["DOCUMENT_ROOT"]);
$endpoint    = $wsdl;
$soapOptions = array(    'exceptions'     => 0
                        ,'soap_version'   => SOAP_1_2
                        ,'trace'          => true
                                                                    ,'uri' => $theversion
                        ,'location' => $url
                                                    ); 

$header = new SoapHeader($theversion,'', $ppid);

$client->__setSoapHeaders($header);  

    $response = $client->SendLocalList($search_query);

アップデート

私は近づいていますが、それでも最後のハードルに落ちています以下はリストを作成します

while ($row2 = $db->getResult()) { 
$search_query[] = new  SoapStructAuthorisationData($row2['rfid'],array(new 
SoapStructIdTagInfo('ConcurrentTx'))); 
}

// implode with commas and remove last comma

$search_list=implode(', ', $search_query);

$search_list_nocommaend = rtrim($search_list, ', ');

これのvar_dumpは、SoapStructAuthorisationData、SoapStructAuthorisationData、SoapStructAuthorisationData、SoapStructAuthorisationData、SoapStructAuthorisationDataを生成します。

上記のコードを「newSoapStructAuthorisationData($ row2 ['rfid']、array(new SoapStructIdTagInfo('ConcurrentTx')))」のようなスピーチマークで囲むと、全体を生成しますが、次のようにすると表示されません

  if($soapServiceSend->SendLocalList(new SoapStructSendLocalListRequest($updateType,
     $listversion, 
  array( $search_list_nocommaend ))))

私がテストピースのためにこのようなことをすると、それは機能します

$search=new SoapStructAuthorisationData('BUKIEE',array(new 
SoapStructIdTagInfo('ConcurrentTx')));

誰かアイデアはありますか?

4

1 に答える 1

1

私はこの種の問題に何度も直面し、最も簡単な解決策を見つけました:http ://www.wsdltophp.com/

ここでWSDLをアップロードすると、サーバーとの通信に必要なすべてのクラスが作成されます。

試してみると、クラスの作成を自分で行う必要がないことがわかるかもしれません。

追伸 データを配列として送信してはならない場合があることがわかったので、一般的なオプションで「配列をパラメータとして送信」のマークを外します。

編集-Wsdl2PHPからのコード

<?php
$soap = new Saop2StructSendLocalListRequest(); 
$soap->SendLocalList(
    new Saop2StructSendLocalListRequest(
        $updateType, 
        $listversion, 
        array (
            new Saop2StructAuthorisationData(), 
            new Saop2StructAuthorisationData(), 
            new Saop2StructAuthorisationData()
        )
    )
);
于 2013-03-01T14:44:53.953 に答える