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')));
誰かアイデアはありますか?