2015-04-29 16 views
2

可能會提出這個問題,但搜索起來很困難,我找不到任何有關它的信息。再加上它不容易問。Zend SOAP:在WSDL中將缺省數組元素名稱「item」更改爲複雜類型的類名稱

我正在使用Zend SOAP的自動發現重新創建我們的舊SOAP接口(因爲切換到微服務和重新工作的一切)。

到目前爲止,它的工作就像一個魅力。但是在使用列表/數組時,我在重新創建一些服務的SOAP響應時遇到了一個問題。

SOAP請求的舊響應XML看起來像這樣。它包含<SMSEntries>列表中的兩個<SMSEntry>

<SOAP-ENV:Envelope> 
    <SOAP-ENV:Body> 
     <ns1:getSMSByTimeSpanResult> 
     <AmountOfEntries>2</AmountOfEntries> 
     <SMSEntries> 
      <SMSEntry></SMSEntry> 
      <SMSEntry></SMSEntry> 
     </SMSEntries> 
     </ns1:getSMSByTimeSpanResult> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

但重新創建的響應看起來像這樣。它包含<SMSentries>列表中的SMSEntry類型的兩個<item>

<SOAP-ENV:Envelope> 
    <SOAP-ENV:Body> 
     <ns1:getSMSByTimeSpanResponse> 
     <return xsi:type="ns1:getSMSByTimeSpanResponse"> 
      <AmountOfEntries xsi:type="xsd:int">2</AmountOfEntries> 
      <SMSEntries SOAP-ENC:arrayType="ns1:SMSEntry[2]" xsi:type="ns1:ArrayOfSMSEntry"> 
       <item xsi:type="ns1:SMSEntry"></item> 
       <item xsi:type="ns1:SMSEntry"></item> 
      </SMSEntries> 
      <DataEx xsi:nil="true"/> 
     </return> 
     </ns1:getSMSByTimeSpanResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

我無法控制客戶。他們可能正在通過比較字符串來檢查SMSEntry。我想使用類名稱SMSEntry作爲XML標籤名稱。

二,我想省略其他的東西,包裝一切,<return>標籤。

我使用這樣的自動發現:

use Zend\Soap\AutoDiscover; 
use Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex; 

$autoDiscover = new AutoDiscover(new ArrayOfTypeComplex()); 
$autoDiscover->setClass(new Standard($sm)); 

的getSMSByTimeSpanResponse的定義是這樣的:

Standard.php

/** 
* Class getSMSByTimeSpanResponse 
* 
* @package LgxServiceManager\Service 
*/ 
class getSMSByTimeSpanResponse 
{ 
    /** 
    * @var int 
    */ 
    public $AmountOfEntries; 

    /** 
    * @var \LgxServiceManager\Service\SMSEntry[] 
    */ 
    public $SMSEntries; 
} 

/** 
* Class SMSEntry 
* 
* @package LgxServiceManager\Service 
*/ 
class SMSEntry 
{ 
} 

有誰知道如何任何想法這個?

我發現一些代碼在library\Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence.php:122_addSequenceType()一種方法是設置硬編碼的屬性:

$element->setAttribute('name', 'item'); 

但這式「序列」不輸入「情結」就像我使用...

謝謝你在前進, 菲利普


\ ED IT

天哪......我只是發現了另一種結構,我不知道如何與Zend的SOAP的自動發現創建...

<mainMember1>SERIALNUMBER</mainMember1> 
<mainMember2>NAMEOFPRODUCT</mainMember2> 
<mainMember3>000000-000-0</mainMember3> 
<Rules> 
    <RuleEntry> 
     <singleValue>allow</singleValue> 
     <ResourceList> 
      <Name>generic</Name> 
      <ResourceEntry>[...]</ResourceEntry> 
      <ResourceEntry>[...]</ResourceEntry> 
      <ResourceEntry>[...]</ResourceEntry> 
     </ResourceList> 
     <ResourceList> 
      <Name>default</Name> 
      <ResourceEntry>[...]</ResourceEntry> 
      <ResourceEntry>[...]</ResourceEntry> 
      <ResourceEntry>[...]</ResourceEntry> 
     </ResourceList> 
    </RuleEntry> 
</Rules> 

正如你可以看到,裏面有一個在<singleValue><RuleEntry>但是多個<ResourceList> s。資源列表中使用相同的結構:一個<Name>和多個<ResourceEntry> ...

這甚至可以用自動發現來處理嗎?

+1

這也許給你一些提示:http://stackoverflow.com/questions/17307571/zend-framework-2-soap-autodiscover-and-complex-types –

+1

謝謝。我自己想出了這個問題,並且已經按照我的問題代碼中所描述的那樣使用它。我的WSDL看起來非常好。但是,XML的響應要比那些「item」元素... –

+0

無論答案如何,我都感到你的痛苦。任何時候任何人都應該暗示使用SOAP,你必須非常快速地喊「使用REST!」在他們身上。 – icc97

回答

0

對任何人來說仍具有上述的問題:stdClass()這樣 默認響應:

$array = ['lets', 'test', 'it']; 
$response = new stdClass(); 
$response->results = $array; 

會像:

<return xsi:type="SOAP-ENC:Struct"> 
    <results SOAP-ENC:arrayType="xsd:string[3]" xsi:type="SOAP-ENC:Array"> 
     <item xsi:type="xsd:string">lets</item> 
     <item xsi:type="xsd:string">test</item> 
     <item xsi:type="xsd:string">it</item> 
    </results> 
</return> 

我們能做什麼 - 我們可以改變數組ArrayObject()

$array = ['lets', 'test', 'it']; 

    $response = new stdClass(); 
    $response->results = new ArrayObject(); 
    foreach($array as $item) { 
     $response->results->append($item); 
    } 

哪個返回:

  <return xsi:type="SOAP-ENC:Struct"> 
      <results xsi:type="SOAP-ENC:Struct"> 
       <BOGUS xsi:type="xsd:string">lets</BOGUS> 
       <BOGUS xsi:type="xsd:string">test</BOGUS> 
       <BOGUS xsi:type="xsd:string">it</BOGUS> 
      </results> 
     </return> 

最後蛋糕上的糖霜:

$array = ['lets', 'test', 'it']; 

$response = new stdClass(); 
$response->results = new ArrayObject(); 
foreach($array as $item) { 
    $soapVar = new SoapVar($item,XSD_STRING,NULL,NULL,'result'); 
    $response->results->append($soapVar); 
} 

它將返回:

<return xsi:type="SOAP-ENC:Struct"> 
    <results xsi:type="SOAP-ENC:Struct"> 
     <result xsi:type="xsd:string">lets</result> 
     <result xsi:type="xsd:string">test</result> 
     <result xsi:type="xsd:string">it</result> 
    </results> 
</return> 

正如你可以看到第五個參數告訴這將是XML元素的關鍵。你也需要知道第二個參數,因爲它告訴哪個是變量的類型。你可以找到更多在這裏: https://secure.php.net/manual/en/class.soapvar.php

相關問題